Ir ao conteúdo
  • Cadastre-se

DavidsonBruno

Membro Júnior
  • Posts

    15
  • Cadastrado em

  • Última visita

Reputação

4
  1. Olá de novo, meu povo! Estou modelando um banco de dados de um sistema de finanças pessoais e me deparei com um problema de modelagem. Nos sistemas financeiros atuais, há o conceito de lançamento fixo, que se repete "infinitamente" ou por um período de tempo especificado. Em cada lançamento é possível fazer alterações específicas, como marcá-lo como pago, por exemplo. Este é um problema análogo dos sistemas de agenda atuais, como Google Agenda e Calendário do Outlook, que trabalham com compromissos que se repetem. Como este conceito é implementado em banco de dados?
  2. Bom, nos meus tempos de Nero, havia duas formas de gravar discos: criando um disco de dados ou um disco de áudio. A diferença está em que no primeiro você escreve os dados da maneira que estão no disco, sem qualquer alteração ou preparação para um tipo de mídia específico. Neste formato, escolhendo músicas de 4MB em média, é possível gravar mais ou menos 175 músicas no disco. Porém se você necessita escutá-las em um toca discos ou qualquer aparelho que exija um disco em que estejam gravadas nele faixas de áudio, o que você precisa fazer é gravar um disco de áudio. Nele, as faixas são convertidas e o tamanho final de cada arquivo fica bem maior, fazendo com que caibam bem menos músicas no disco. Mas ressalto que este último é o mais adequado se você precisa executá-las em um aparelho de som específico que só aceite audio tracks. Com o Nero essas duas opções estão disponíveis. Recomendo dar uma olhada em conteúdos na internet para aprender a utilizar a ferramenta.
  3. @Oliveira Jane Olá! Seja bem-vinda ao Fórum! Se eu não estou enganado, verificar a pertinência de um elemento é verificar se o elemento existe nos conjuntos criados. Alguma outra dúvida?
  4. @paulov1234 Seja bem-vindo ao fórum! Por favor, insira o seu código na tag CODE para melhorar a legibilidade e facilitar o entendimento de quem puder te ajudar. Então, pelo que pude entender, o que você quer é criar uma função que ordene a exibição da lista de voos por ordem crescente de hora, é isso? Para uma lista crescente, dentro dessa função você pode copiar a lista de voos para uma lista auxiliar, varrer essa lista auxiliar usando um laço (while, for, o que quiser), em cada iteração você buscaria o voo de menor hora e minutos (no caso, o próximo voo), imprimia na tela o que fosse encontrado e removeria este elemento da lista para a próxima iteração até que a lista auxiliar estivesse vazia. Conseguiu me acompanhar? Aqui vai uma dica: no seu código você criou estruturas repetidas para representar dois cenários distintos, no caso "aeroporto" e "aeroportoCHEGADA". Perceba que essas duas estruturas tem exatamente os mesmos atributos, o que torna esta declaração duplicada desnecessária. Pense que a estrutura é o esqueleto de uma instância real. Por exemplo: // essa estrutura é a base de qualquer voo de partida e chegada struct voo { int numeroVoo; char companhia[50]; char local[50]; int duracaoHoras; int duracaoMinutos; int portao; }; // aqui você cria instâncias dessa estrutura para representar o cenário de partida e de chegada voo *partida[qtdMaxVoos]; voo *chegada[qtdMaxVoos]; // aqui você manipula os atributos da instância voo criada cout << partida[0].local; // imprime o local (pode ser de partida ou de chegada, depende de qual das instâncias nos referimos) A mesma coisa acontece com sua fila: a estrutura é a mesma para duas filas distintas. Não é necessário criar "fila" e "fila1". Basta que se crie apenas uma estrutura. Por exemplo: // estrutura struct fila { int numeroelementos; int inicio; voo voos[TAMANHO]; }; // instâncias fila *listaVoosPartida[qtdMaxVoos]; fila *listaVoosChegada[qtdMaxVoos]; Era essa a solução que você queria?
  5. @Fernando Apratto Fala Fernando! Então, é exatamente isso. Em opções avançadas não aparece unidade nenhuma. Fica vazio, sendo que o GParted reconhece todas as partições. Essa tela que você me mostrou inclusive nem aparece no momento da instalação, ele avança direto para o que seria a tela de Opções Avançadas. Vou repetir o processo quando estiver com meu computador para capturar a tela e anexar neste post. Vai ficar mais fácil. Agradeço imensamente a dica!
  6. @JorgeGomes É possível você postar o código completo da sua aplicação? Isso é necessário para que entendamos o que você quer fazer exatamente e até onde você conseguiu fazer.
  7. @Nicolas Gustavo Conte O seu código continha algumas linhas desnecessárias e partes que não faziam muito sentido. Fiz algumas alterações e o resultado é esse: <html> <head> <title>CPF.gov</title> </head> <body background="http://www.caixa-pis.com/wp-content/uploads/2016/04/consultar-cpf.jpg"> <?php /* CPF de entrada */ $CPF= "12345678901"; /* separa a string de entrada em um vetor de dígitos */ $vetorNumeros = str_split($CPF); /* Z1 é o acumulador do penúltimo dígito */ $Z1 = 0; $Z1 += $vetorNumeros[0] * 10; $Z1 += $vetorNumeros[1] * 9; $Z1 += $vetorNumeros[2] * 8; $Z1 += $vetorNumeros[3] * 7; $Z1 += $vetorNumeros[4] * 6; $Z1 += $vetorNumeros[5] * 5; $Z1 += $vetorNumeros[6] * 4; $Z1 += $vetorNumeros[7] * 3; $Z1 += $vetorNumeros[8] * 2; /* Calcula o resto da divisão de (Z1 vezes 10) por 11 */ $C = ($Z1*10) % 11; //alterado /* Se o resultado for 10, atribui 0 */ if($C == 10) $C = 0; /* N2 é o acumulador do último dígito */ $N2 = 0; $N2 += $vetorNumeros[0] * 11; $N2 += $vetorNumeros[1] * 10; $N2 += $vetorNumeros[2] * 9; $N2 += $vetorNumeros[3] * 8; $N2 += $vetorNumeros[4] * 7; $N2 += $vetorNumeros[5] * 6; $N2 += $vetorNumeros[6] * 5; $N2 += $vetorNumeros[7] * 4; $N2 += $vetorNumeros[8] * 3; $N2 += $vetorNumeros[9] * 2; /* Calcula o resto da divisão de (N2 vezes 10) por 11 */ $C2 = ($N2*10) % 11; /* Se o resultado for 10, atribui 0 */ if($C2 == 10) $C2 = 0; /* Verifica se o penúltimo dígito de verificação calculado for igual ao penúltimo dígito do cpf inserido e se o último dígito de verificação calculado for igual ao último dígito do cpf inserido */ if($C == $vetorNumeros[9] && $C2 == $vetorNumeros[10]) echo "O CPF ".$CPF." é válido"; else echo "O ".$CPF." é falso ou foi digitado errado!"; ?> </body> </html> Uma dica muito importante na hora de programar é identar o seu código para visualizar melhor o que está fazendo. Adicione espaços e aplique tabulações na hora de escrevê-lo. Outra dica importante é atribuir nomes de variáveis que façam sentido e que identifiquem o que está sendo feito. Se isso não puder acontecer, adicione legendas em comentários, como eu fiz com o seu código. Dessa maneira qualquer um entenderá o que você fez sem dificuldades. Se tiver alguma dúvida, por favor me diga.
  8. Você precisa capturar os IDs dos elementos para manipulá-los. Depois é preciso registrar os eventos em listeners. O código do seu javascript ficaria mais ou menos assim: var display = document.getElementById("display"); var btZero = document.getElementById("btZero"); var btUm = document.getElementById("btUm"); var btDois = document.getElementById("btDois"); var btTres = document.getElementById("btTres"); var btQuatro = document.getElementById("btQuatro"); var btCinco = document.getElementById("btCinco"); var btSeis = document.getElementById("btSeis"); var btSete = document.getElementById("btSete"); btZero.addEventListener('click', function(){ display.value += "0"; }); btUm.addEventListener('click', function(){ display.value += "1"; }); btDois.addEventListener('click', function(){ display.value += "2"; }); btTres.addEventListener('click', function(){ display.value += "3"; }); btQuatro.addEventListener('click', function(){ display.value += "4"; }); btCinco.addEventListener('click', function(){ display.value += "5"; }); btSeis.addEventListener('click', function(){ display.value += "6"; }); btSete.addEventListener('click', function(){ display.value += "7"; }); //etc. Esqueci uma coisa: você precisa garantir que o DOM tenha sido carregado antes de manipular os elementos. Para isto, mova a chamada ao arquivo javascript no arquivo html para a linha que antecede o fechamento da tag </body>. Assim: <script type="text/javascript" src="js/calculator.js"></script> </body> </html>
  9. Olá amigos, Sou leigo no assunto, por isso resolvi abrir este tópico. Procurei atentamente a solução antes de postá-lo, porém se já estiver em discussão, fiquem à vontade para encerrá-lo e me redirecionar. Tenho uma máquina rodando o Windows 10 e resolvi fazer Dual Boot com a versão 64bits da distribuição do Ubuntu 16.04.2. Ela consegue carregar os dados do pendrive tanto em UEFI como em Legacy. Criei o pendrive Bootável, com sistema de arquivos FAT32. Criei uma partição não alocada com o Gerenciamento de Disco do Windows de 25GB, para dividi-la em 21GB para o Sistema e 4Gb para o Swap. Até aí tudo bem. Inicializei o Live CD em modo de experimentação para criar as partições antes da instalação definitiva. Depois de abrir o GParted, precisei criar uma partição estendida, já que o limite é de 4 partições primárias que podem ser criadas. Dentro dela criei as partições listadas acima, uma em ext4 e outra em linux-swap. Agora é que vem o problema. Quando inicio a instalação, na primeira vez ele reconhece as redes disponíveis do Wi-fi e em vezes posteriores não. Por exemplo, se eu encerrar o modo de instalação e carregar novamente ele não é capaz de encontrar as redes disponíveis. Para isso eu preciso excluir as partições criadas através do Windows e repetir os passos acima todos outra vez. Mas isso não é um problema grave já que posso continuar a instalação normalmente na primeira vez que tento. Porém, mais à frente, quando o Ubuntu deveria tentar reconhecer qualquer sistema operacional instalado ele pula diretamente para a tela de "Tipo de Instalação" e não exibe nenhuma partição que é reconhecida pelo GParted. Ou seja, não consigo definir a partição raiz nesta etapa da instalação. Alguma sugestão do que possa ser?
  10. Olá mais uma vez! Creio que consegui resolver o problema. Na página de checkout eu estava utilizando return para devolver o callback pra chamada ajax, quando na verdade ela espera dado escrito. Então modifiquei "return $callback" para "echo "$callback", como se segue: $callback = '<div class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2"> <div class="box-ingredient"> <select name="ingredients">'.$options.'</select> <div class="group"> <label for="amount">Quantidade:</label> <input type="number" name="amount" min="1" value="1"> </div> <div class="row center-xs"> <div class="col-xs"> <span class="total">R$ 4,00</span> </div><div class="col-xs"><a href="" class="removeIngredient">Remover</a> </div> </div> </div> </div>'; echo $callback; //antes essa linha estava declarada como "return $callback" Desde já quero agradecer demais a disponibilidade da sua ajuda e espero que esta solução possa ser útil para mais pessoas. Valeu!
  11. Perfeito. Vamos lá: a página "Novo Item" que estou construindo para a minha WebApp vai permitir o usuário adicionar ingredientes dinamicamente ao construir o seu item personalizado. Os ingredientes serão carregados do banco com base na escolha de categoria feita na página anterior, por exemplo: o usuário escolhe "pizza", clica em "Novo Item" e este é levado à página de novo item, aonde terá um box inicial de ingredientes disponíveis para escolher. A página ainda fornecerá a opção de criar outros boxers, dinamicamente. A configuração segue mais ou menos como as imagens que estão em anexo. Tenho uma classe Connection responsável por conectar ao banco e armazenar as queries da seguinte forma: <?php class Connection { private static $host = "localhost"; private static $username = "root"; private static $password = ""; private static $database = "database"; private static $connection = null; public static function start() { self::$connection = new mysqli(self::$host, self::$username, self::$password, self::$database) or exit(self::$connection->error()); } public static function close() { self::$connection->close(); } public static function login($user) { self::start(); $success = false; $query = "SELECT * FROM TB_User WHERE User_Email = '{$user['email']}'"; $result = self::$connection->query($query) or exit(self::$connection->error); if($result->num_rows == 1) { $row = $result->fetch_assoc(); $cookie = array('id' => $row['User_ID'], 'firstName' => $row['User_FirstName'], 'lastName' => $row['User_LastName'], 'status' => 'active'); if($row['User_Password'] == $user['password']) { $user['keepConn'] == "Yes" ? setcookie('user', serialize($cookie), (time() + 3600*24*30)) : setcookie('user', serialize($cookie)); $success = true; } else { $success = false; } } self::close(); return $success; } public static function logout() { setcookie('user', '', time()-1); } public static function register($user) { self::start(); if(!isset($user['email']) || !isset($user['password'])) { $success = false; } else { $query = "INSERT INTO TB_User VALUES (DEFAULT, '{$user['email']}', '{$user['password']}', '{$user['firstName']}', '{$user['lastName']}', '{$user['birthday']}', '{$user['cpf']}', NOW())"; $result = self::$connection->query($query) or exit(self::$connection->error); $query = "SELECT LAST_INSERT_ID() INTO @USER_ID"; self::$connection->query($query) or exit(self::$connection->error); for($i = 0, $x = count($user['address']['street']); $i < $x; $i++) { $fullStreet = $user['address']['street'][$i].";".$user['address']['number'][$i].";".$user['address']['complement'][$i]; $query = "INSERT INTO TB_Address VALUES (DEFAULT, '{$fullStreet}', '{$user['address']['neighborhood'][$i]}', '{$user['address']['city'][$i]}', '{$user['address']['state'][$i]}')"; self::$connection->query($query) or exit(self::$connection->error); $query = "SELECT LAST_INSERT_ID() INTO @ADDRESS_ID"; self::$connection->query($query) or exit(self::$connection->error); $query = "INSERT INTO TB_User_Address VALUES ('{$user['address']['name'][$i]}', @USER_ID, @ADDRESS_ID)"; self::$connection->query($query) or exit(self::$connection->error); } for($i = 0, $x = count($user['phone']['number']); $i < $x; $i++) { $query = "INSERT INTO TB_Phone VALUES (DEFAULT, '{$user['phone']['number'][$i]}', '{$user['phone']['type'][$i]}', '{$user['phone']['provider'][$i]}', @USER_ID)"; self::$connection->query($query) or exit(self::$connection->error); } $success = true; } self::close(); return $success; } public static function userIsSet() { if(!isset($_COOKIE['user'])) { header('Location: index.php'); } } public static function getUserProfile() { self::start(); $userID = unserialize($_COOKIE['user'])['id']; $profile = false; $query = "SELECT User_ID, User_Email, User_FirstName, User_LastName, User_Birthday FROM TB_User WHERE User_ID = {$userID}"; $result = self::$connection->query($query) or exit(self::$connection->error); if($result->num_rows == 1) { $profile = $result->fetch_assoc(); } self::close(); return $profile; } public static function getUserAddresses() { self::start(); $userID = unserialize($_COOKIE['user'])['id']; $addresses = array(); $query = "SELECT * FROM TB_User_Address JOIN TB_Address ON User_Address_Address_ID = Address_ID JOIN TB_User ON User_Address_User_ID = {$userID}"; $result = self::$connection->query($query) or exit(self::$connection->error); while($row = $result->fetch_assoc()) { $addresses[] = $row; } self::close(); return $addresses; } public static function getUserPhones() { self::start(); $userID = unserialize($_COOKIE['user'])['id']; $phones = array(); $query = "SELECT * FROM TB_Phone WHERE Phone_User_ID = {$userID}"; $result = self::$connection->query($query) or exit(self::$connection->error); while($row = $result->fetch_assoc()) { $phones[] = $row; } self::close(); return $phones; } public static function getAllStates() { self::start(); $states = array(); $query = "SELECT * FROM TB_State"; $result = self::$connection->query($query) or exit(self::$connection->error); while($row = $result->fetch_assoc()) { $states[] = $row; } return $states; self::close(); } public static function getAllCategories() { self::start(); $categories = array(); $query = "SELECT * FROM TB_Category"; $result = self::$connection->query($query) or exit(self::$connection->error); while($row = $result->fetch_assoc()) { $categories[] = $row; } return $categories; self::close(); } public static function getAllIngredientsByCategory($categoryID) { self::start(); $ingredients = array(); $query = "SELECT Ingredient_Category_Category_ID, Ingredient_ID, Ingredient_Name, Ingredient_Price, Ingredient_Price, UnitMeas_SingularName FROM TB_Ingredient_Category JOIN TB_Ingredient ON Ingredient_ID = Ingredient_Category_Ingredient_ID JOIN TB_UnitMeas ON UnitMeas_ID = Ingredient_UnitMeas_ID WHERE Ingredient_Category_Category_ID = {$categoryID} ORDER BY Ingredient_Name"; $result = self::$connection->query($query) or exit(self::$connection->error); while($row = $result->fetch_assoc()) { $ingredients[] = $row; } return $ingredients; } public static function saveNewItem() { self::start(); $query = ""; self::close(); } } ?> Tenho ainda outro arquivo, checkout.php, responsável por mediar as transações realizadas na aplicação. Quando um usuário solicita a adição de um novo ingrediente, é essa a página requisitada via ajax para callback. <?php require_once "class/Connection.php"; { if(isset($_POST['name'])) { $fullName = explode(" ", ($_POST['name']), 2); } else { $fullName[0] = null; $fullName[1] = null; } $user['email'] = @$_POST['email']; $user['password'] = @$_POST['password']; $user['keepConn'] = @$_POST['keepConn']; $user['firstName'] = @$fullName[0]; $user['lastName'] = @$fullName[1]; $user['birthday'] = @$_POST['birthday']; $user['cpf'] = @$_POST['cpf']; $user['address']['street'] = @$_POST['street']; $user['address']['number'] = @$_POST['addressNumber']; $user['address']['complement'] = @$_POST['complement']; $user['address']['neighborhood'] = @$_POST['neighborhood']; $user['address']['city'] = @$_POST['city']; $user['address']['state'] = @$_POST['state']; $user['address']['name'] = @$_POST['addressName']; $user['phone']['number'] = @$_POST['phoneNumber']; $user['phone']['type'] = @$_POST['phoneType']; $user['phone']['provider'] = @$_POST['provider']; $action = isset($_POST['action']) ? $_POST['action'] : ''; } if(isset($_POST['login'])) { Connection::login($user) ? header('Location: index.php') : header('Location: login.php'); } if(isset($_POST['register'])) { if(Connection::register($user)) { Connection::login($user); header('Location: index.php'); } else { header('Location: register.php'); } } if(isset($_GET['logout'])) { Connection::logout(); header('Location: index.php'); } if(isset($_GET['profile'])) { if(isset($_COOKIE['user'])) { header('Location: profile.php'); } else { header('Location: index.php'); } } if($action == 'addIngredient') { $ingredients = Connection::getAllIngredientsByCategory(1); $max = count($ingredients); $options = ''; for($i = 0; $i < $max; $i++) { $id = $ingredients[$i]['Ingredient_ID']; $name = utf8_encode($ingredients[$i]['Ingredient_Name']); $unitMeas = utf8_encode($ingredients[$i]['UnitMeas_SingularName']); $options .= '<option value="$id">$name ($unitMeas)</option>'; } $callback = '<div class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2"> <div class="box-ingredient"> <select name="ingredients">$options</select> <div class="group"> <label for="amount">Quantidade:</label> <input type="number" name="amount" min="1" value="1"> </div> <div class="row center-xs"> <div class="col-xs"> <span class="total">R$ 4,00</span> </div><div class="col-xs"><a href="" class="removeIngredient">Remover</a> </div> </div> </div> </div>'; return $callback; } ?> Ainda tenho outro arquivo, functions.js, que se utiliza de jQuery para fazer as requisições ajax de que preciso. $(document).ready(function() { var maxField = 5; var xIngredients = 1; // campos iniciais var wrapIngredients = ".wrap-ingredients"; var addIngredient = ".add-ingredient"; $(addIngredient).click (function(e) { e.preventDefault(); //prevenir novos clicks if (xIngredients < maxField) { $.ajax({ url: 'checkout.php', type: 'POST', data: {action: 'addIngredient'}, success: function(callback) { $(wrapIngredients).append(callback); } }); xIngredients++; } }); // Remover o div anterior $(wrapIngredients).on("click",".removeIngredient",function(e) { e.preventDefault(); $(this).parent('div').remove(); xIngredients--; }); }); Porém, é aí que mora o meu problema. O DOM retorna o callback vazio, como podemos ver na imagem Screenshot_4.png anexada. Alguma ideia do que eu possa estar fazendo errado? Sinceramente, não consigo entender o porque o callback retorna vazio.
  12. Um salve para toda a comunidade Clube do Hardware! Preciso adicionar campos dinamicamente e popular os selects de um formulário com dados do banco de dados de forma assíncrona através de ajax. Alguém que tenha esse conhecimento poderia me ajudar? Pesquisei bastante sobre requisições XMLHTTPRequest e Ajax via jQuery, mas ainda é um enigma para mim: o conhecimento na minha cabeça só entra a ferro de fogo e eu estou com o prazo contado! Desde já agradeço muito a quem se dispuser a me ajudar!

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...