Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.622
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. // Lista os produtos vinculados if (isset($_GET['lista'])) { echo "<table><tr><th><th><th>"; $query=$mysqli->query("select * from vw_multiplo"); while ($row=$query->fetch_assoc()){ $codprod = $row['codprod']; $prod = $row['prod']; $un = $row['un']; $custo = dec($row['custo']); $json = $row['codforn']; $obj=json_decode($json);$codprod1=$obj->cod;$conv=$obj->conv; $query2=$mysqli->query("select * from tbprod where codprod=$codprod1"); $linha = $query2->fetch_assoc(); $prod1=$linha['prod']; $custo1=dec($linha['custo']); $un1 = $linha['un']; echo "<tr style='color:red'><td align=right>$codprod1<td>$un1<td>$prod1<td align=right>$custo1"; echo "<tr><td align=right>$codprod<td>$un<td>$prod<td align=right>$custo";} echo "</table>"; mysqli_close($mysqli); exit;} Eu fiz uma rotina que lista o produto principal e o produto vinculado. Eu queria avermelhar o produto principal. Eu tentei <font color=red><tr><td>$codprod<td>$un<td>$prod<td>$custo</font>, mas não funcionou. Eu tentei <tr color=red>, mas não funcionou. Mas hoje eu tive muita sorte no Google, encontrei uma dica de como avermelhar o texto sem precisar usar o CSS. A solução é <tr style="color:red">. Isso demorou dois anos, mas consegui achar. O Google é uma questão de perseverança e sorte.
  2. Eu sou péssimo em HTML e também não sei mexer com o PDO do PHP, mesmo assim, ao invés de inserir o PHP no HTML, eu faço o contrário, eu insiro o HTML pelo PHP. Para montar uma caixa de combinação eu faço assim: <?php $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select * from tbprod order by prod asc"); echo "<select>"; echo "<option>Selecione</option>"; while ($reg=$query->fetch_assoc()) { echo "<option>".$reg['prod']."</option>"; } echo "</select>"; mysqli_close($mysqli);
  3. <?php // multiplo.php include("menu.php"); function dec($num) {if (empty($num)) {$fmt="";} else {$fmt = number_format($num,2,',','.'); return $fmt;}} $codprod = $_GET['codprod'] ?? null; $mysqli=new mysqli("localhost","root","","diario"); if ($codprod==225) { echo "<a href=multiplo.php?com=atualiza>Atualizar produtos vinculados</a>"; exit;} // Atualiza os produtos vinculados if (isset($_GET['com'])) { echo "<table><tr><th><th>"; $query=$mysqli->query("select * from vw_multiplo"); while ($row=$query->fetch_assoc()){ $codprod = $row['codprod']; $prod = $row['prod']; $json = $row['codforn']; $obj=json_decode($json);$codprod1=$obj->cod;$conv=$obj->conv; $query2=$mysqli->query("select * from tbprod where codprod=$codprod1"); $linha2=$query2->fetch_assoc(); $custo2=$linha2['custo']; $custo2=dec(round($custo2/$conv,2)); $query3=$mysqli->query("update tbprod set custo=$custo2 where codprod=$codprod"); echo "<tr><td>$codprod<td>$prod<td align=right>$custo2";} echo "</table>"; mysqli_close($mysqli); exit;} Eu levei meia hora para fazer o código que calcula o custo de um produto baseado no custo de outro produto, mas aqui eu preciso agradecer ao Forum Script Brasil, em particular o Iowys e o Wash, que me ensinaram como criar um modal, como usar o Json e como atualizar o PHP para a versão 8. Eu gostei do PHP 8, ele não só mostra onde você errou mas também mostra a parte da listagem do código onde ele encontrou o erro. No meu caso, ele reclamou que eu abuso demais das funções que uso de maneira irregular (foi assim que traduzi "deprecated"), mas ao invés de estudar lógica de programação, eu preferi fazer a minha gambiarra - só assim você vai entender a função "dec" (decimal) que aparece no topo da listagem. Vamos ao que interessa. Uma melancia (código 123) custa R$ 4,00. Logo, 1/4 de melancia (codigo 5717) custa R$ 1,00. Ao invés de criar uma tabela para informar ao PHP qual produto está vinculado ao outro, eu pedi para o MySQL criar uma consulta com essa informação, eu chamei de vw_multiplo. No produto do código 123 eu tenho o campo codforn, onde eu tenho o código do produto do fornecedor que pretendo usar no meu pedido de compra. Essa é uma informação valiosa, é o único jeito que eu encontrei para o fornecedor não me mandar chuchu no lugar da melancia. Já o codforn do produto 5717 eu coloquei o Json, assim {"cod":123,"conv":4}. Graças ao Json, o MySQL sabe quem é produto original e quem é o produto vinculado e o PHP sabe como como calcular o custo de 1/4 de melancia. Agora, vamos aos imprevistos. E se eu precisar fazer uma promoção do tipo "melancia em dobro", nesse caso o Json ficaria assim {"cod":123,"conv":0.5}. E se eu precisar fazer uma combo tipo "melancia com chuchu"? Nesse caso, o meu código não tem como resolver isso, ele teria que ser reescrito para ver quantos Jsons tem dentro do campo codforn. É claro que a notação Json é muito chata, mas eu consegui resolver isso lá atrás, na hora de cadastrar o produto vinculado, eu criei um input assim <input name=fator value={"cod":'.$codprod.',"conv":> ou seja, quem for cadastrar só precisa colocar o fator de conversão e fechar o colchete.
  4. Eu vi que o PHP usa dois bytes para representar a letra á. Encontrei no Google comentário sobre o Normalizer do PHP (PHP: Normalizer::normalize - Manual), mas não consegui adequar ao JavaScript. É uma pena. Essa é mais uma tentativa que não deu certo.
  5. Hoje gastei o dia todo vendo matéria sobre código de caracteres UTF-8 e ISO-8859-1, mas não consegui aprender muita coisa. O máximo que eu descobri é que o Notepad++ pode formatar os meus códigos em PHP para esses caracteres. O problema é o velho problema das variáveis com aspas embutidas. Hoje eu pensei em transformar tudo em hexadecimal, mandar do PHP para o JavaScript, e depois o JavaScript decodifica. O problema é que o hexadecimal do PHP é uma coisa, e o hexadecimal do JavaScript é outra coisa. O máximo que eu consegui conferir é que a tabela que o JavaScript usa é a mesma que o Excel usa, desconfio que é o ANSI. Mas na hora que eu peço para o PHP trabalhar com o ANSI tudo fica pior, o JavaScript consegue entender o que eu quero, mas eu não consigo entender o que o PHP escreve na tela. É um horror! Esse é o meu rascunho que não deu certo, e que eu chamei de aStudy.php <meta charset=UTF-8 /> <script charset=UTF-8> function hex_to_ascii(str1) { inpJava.value=2; var hex = str1.toString(); var str = ''; for (var n = 0; n < hex.length; n += 2) { str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));} inpJava.value=str; } </script> <?php $mens ='olá "mundo"'; $hexa = bin2hex($mens); $bina = hex2bin($hexa); echo "mensagem $mens<br>hexadecimal $hexa<br>binário $bina<br> JavaScript: <input id=inpJava>"; echo "<script>hex_to_ascii('$hexa')</script>";
  6. O seguinte código não funciona: $texto="a vaca foi para o brejo"; echo "<input value=$texto>"; Ele vai trazer um retangulo com a palavra "a". A maneira mais fácil de resolver o problema é usando aspas simples, assim: echo "<input value='$texto'>"; O pesadelo começa quando você é obrigado a usar aspas simples depois do comando echo. Eu fiz de tudo para evitar aspas simples, mas eu não consegui, eu precisava mandar um texto com aspas duplas para o banco de dados (é uma variável Json), e aí fui obrigado a usar aspas simples no comando echo. Depois de dois anos na base da tentativa e erro, finalmente eu achei a solução! Olha só: $texto="a vaca foi para o brejo"; $texto=" ' $texto ' "; echo '<input value='. $texto .'>';
  7. Eu tenho um produto chamado Melancia com o código 924, e pretendo criar um "novo" produto baseado na Melancia, vou chamar de Melancia 1/4, vamos supor que o MySQL vai atribuir o código 7517 para o novo produto. O problema da Melancia é que o preço sempre flutua toda vez que o presidente da Petrobas é demitido, toda vez que os jornalistas descobrem um novo esquema de superfaturamento na compra de caminhão de lixo ou porque alguém desistiu de comprar o Twitter, enfim, vamos supor que o preço da melancia caiu de R$ 5,00 para R$ 4,00, como é que vou lembrar que preciso corrigir o custo do produto 7517? A minha primeira opção é criar uma Tabela Múltipla com o código principal, o código vinculante, e o fator de conversão. No nosso caso, seria 924, 7517, 4. E pediria para o PHP olhar a tabela e corrigir o custo dos produtos vinculados. A segunda opção é não criar nenhuma tabela, e usar a própria tabela de produtos e buscar um campo ocioso. No meu caso, eu tenho um campo chamado Código do Produto do Fornecedor que abreviei como codforn, ele nunca vai ser usado quando criar um produto vinculado a outro. Nesse caso, estava pensando em colocar o Json que é mais fácil de digitar que o Array. A ideia é disparar um gatilho quando o custo de um item for alterado, e pedir para o PHP verificar se tem um produto vinculado no meio do caminho. A terceira opção eu usei no MS Access, deu certo, mas não sei se vai funcionar no MySQL. No MS Access, eu cadastrei o custo do produto 7517 como "F(924)", é uma bela gambiarra, mas não tenho coragem de usar no MySQL. Em teoria dá para fazer essa gambiarra, no MS Access eu tinha o VBA para dar vida para a minha gambiarra, no caso do MySQL eu tenho o PHP. Finalmente, eu apresento um código onde mostra a diferença entre o Json e o Array: <meta name="viewport" content="width=device-width, initial-scale=1"> <?php $json = '{"cod":924,"conv":4}'; // $array = array("cod" => 924, "conv" => 4); $obj = json_decode($json); // extract($array); $cod = $obj->cod; // $conv = $obj->conv; // echo "Código $cod Conversão $conv"; ?>
  8. O código que eu comentei deu problema, ele entrou em conflito com o evento duplo clique que havia definido em outro lugar. O código para o divdetalhe ficou assim: echo "<div id=divdetalhe onclick=alternar(id)>Detalhe do documento $docto</div>"; O div id=divcorrige também ficou com o mesmo formato. A função java que exibe/oculta o div selecionado é esse daqui: <script> function alterna(id) {id=id+"2";element=document.getElementById(id); var visor = $(element).css("display"); if (visor=="block") {element.style.display="none";} else {element.style.display="block";}} </script>
  9. Eu tenho um código PHP que dei o nome de detalhediario.php que é executado assim que eu seleciono um documento no extrato contábil. O código é basicamente isso: // rotina para detalhes do documento // rotina para corrigir o documento. A tela é uma barbaridade, no topo da tela você vê um monte de itens que correspondem à despesa com descrição, quantidade e preço, e bem lá em baixo você vê o formulário para consertar o lançamento contábil. É muito confuso, mesmo sabendo que só eu é que uso a rotina no momento. Sinceramente, eu não sei como consertar o problema. Ao invés de consertar, eu decidi esconder o problema. Eu criei um CSS para esconder, assim <style> .esconder {display:none;} </style>, e mudei o código PHP assim: echo "<div id=divdetalhe onclick=divdetalhe2.style.display='block' ondblclick=divdetalhe2.style.display='none'>Detalhe do documento $docto</div>"; echo "<div id=divdetalhe2 class=esconder>"; // rotina para detalhes do documento echo "</div>"; e eu apliquei a mesma gambiarra para a outra rotina. Agora, o usuário só vê duas linhas depois de selecionar o documento na tela do extrato. Para impressionar o usuário, eu transformei o primeiro <div> numa espécie de botão, eu criei o estilo pintar, assim <style> .pintar {background-color: orange; border 1px solid} </style> e acrescentei na <div> de cada grupo, assim <div id=divdetalhe class=pintar... e <div id=divcorrige class=pintar... Essa não é a maneira correta de se fazer um programa, mas ajuda bastante a diminuir a dor, ao invés de ver toda a baderna, agora você vê uma baderna de cada vez.
  10. O código PHP que uso no micro é o mesmo que uso no celular. Para selecionar um item com o mouse é bem fácil, pois o mouse tem uma ponta que é bem fina, já o celular tem um ponteiro que é bem grosso e que seleciona três itens de uma só vez, e acaba indo justamente aonde você não quer ir. Para resolver o problema, decidi separar os itens um pouco mais, quando for usar o celular, e não mexer nada, quando usar o notebook. O código ficou assim: <meta name="viewport" content="width=device-width, initial-scale=1"> <?php $sistema = substr($_SERVER["HTTP_USER_AGENT"],20,7); if ($sistema=="Android") {echo "<style> li {height: 32px;} </style>";} echo "<li>Jesus<li>Maria<li>José";
  11. Quando eu enfrento esse tipo de problema, eu coloco uma linha "echo" assim: $sqlqtd = "insert into LESAO_REL_ESTOQUE_COBERTURAS values(".$idestoque.", ".$i.", ".$qtd.", ".$marca.", ".$idusuario.")"; echo $sqlqtd; Eu copio o que aparecer na tela, vou lá no MySQL Workbench, uso uma linha de uma query, colo o comando, e tento executar o comando para ver o que acontece. Tudo indica que a tabela LESAO_REL_ESTOQUE_COBERTURAS tem o campo definido como alfanumérico mas você está tentando passar como numérico. A minha sugestão é essa daqui (mudei o nome da tabela para facilitar): $sqlqtd = "insert into tblesao values ($idestoque,$i,$qtd,'$marca',$idusuario)"; supondo que o campo marca é o único campo alfanumérico.
  12. Eu também tive esse problema. Para contornar, eu importei o XML no Excel, ajeitava a planilha para destacar as informações que eu precisava, e depois eu pedi para o Access importar do Excel.
  13. Entendi, mas eu reclamo com a turma do rWindows ou rMySQL?
  14. Ele funciona. Eu baixei a sua planilha do OneDrive para o meu PC pois as macros não funcionam na nuvem, com a exceção da Planilha do Google, mas aí você precisa saber como funciona o Java. Para testar a sua macro, eu fui em Desenvolvedor > Macros > Opções, e lá atribui a tecla [CTRL]+[d] para a sua macro. Eu devo muito ao Excel, foi usando o gravador de macro é que eu aprendi um pouco de Visual Basic. Hoje, os meus códigos são mais legíveis, olha só: Sub Teste() Dim A, B, C, D As Range Set A = Sheets("Targets").Range("A1") Set B = Sheets("Targets").Range("B1") Set C = Sheets("Targets").Range("C1") Set D = Sheets("Targets").Range("D1") If A = B Then D = C End Sub
  15. Bom dia, João Cláudio, eu me expressei mal. Eu pensei que extract fosse uma função definida por você, mas o Google me informou que é uma função do PHP. Vou estudar a função, e peço desculpas por ter atrapalhado.
  16. Aonde você fez o var_dump($artigo)? Foi dentro do ciclo foreach? Se foi fora, suponho que você está vendo o último registro, o de número 9. Os outros 8 já foram usados. Eu suponho que a função extract tenha gerado 9 arquivos diferentes. Tem jeito de você colocar a lista da função extract?
  17. Encontrei um exemplo bacana em Using CSS transitions - CSS | MDN (mozilla.org) <style> a {color: #fff; background-color: #333; transition: all 1s ease-out;} a:hover, a:focus {color: #333; background-color: #fff; } </style> <nav> <a href="#">Home</a> <a href="#">About</a> <a href="#">Contact Us</a> <a href="#">Links</a> </nav>
  18. Eu também sou novato no PHP, mas hoje eu aprendi a criar um vetor com o banco de dados com esse código: <?php $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select prod from tbprod limit 10"); $dados = $query->fetch_all(MYSQLI_ASSOC); // $dados é um vetor com todos os registros foreach ($dados as $dados) { echo $dados['prod']."<br>"; } mysqli_close($mysqli); ?> Não sei como você usa a variável "this->" no seu código, eu ainda não usei isso no PHP, eu só vi no JavaScript, mas também não tenho a menor ideia de como usar. Para eu conseguir os dez primeiros produtos com o método while, eu faço assim: <?php $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select prod from tbprod limit 10"); while ($dados=$query->fetch_assoc()) { // $dados é um vetor com um registro echo $dados['prod']."<br>"; } mysqli_close($mysqli); ?> Ou seja, a diferença entre foreach e while é o conteúdo do vetor, o primeiro presume que todos os registros estão no vetor e outro apenas um registro. Eu sei que não ajudei muito, mas quero agradecer por você compartilhar a sua dúvida, no seu código eu vi echo URL . 'assets/imagens/artigo/' . $imag eu acredito que $imag é uma variável definida pela função "extract" que aparece no seu código. Aconselho a estudar a função "extract" e verificar se ele está criando o arquivo que você deseja.
  19. Usei o ngrok durante dois anos e de repente ele parou de funcionar. Eu vi no Google muita gente na mesma situação. Para saber o que eu fiz de errado, eu decidi ser um cliente "pro" ao invés de "free". O cliente "pro" paga 25 dólares por mês. Quando eles viram o dinheiro, eles decidiram desbloquear a conta, e assim o meu celular passou a enxergar o meu notebook na internet. Eu comentei que mudei o método PUT/GET para POST no PHP, e perguntei se deveria voltar a trabalhar com o método PUT/GET, olha só a resposta deles: No worries on POST, PUT or GET in PHP, but you may want to avoid the file name "1.php" and "login.php" as those names often trigger our automatic abuse flags. Ou seja, o meu erro foi ter usado um nome suspeito no arquivo do PHP, no meu caso, usei bastante 1.php.
  20. Eu gostei da barra de tarefas, só que ele é um pouco mais alto que a barra do Windows 10. A altura da nova barra não atrapalha em nada o meu trabalho, só sinto dificuldade na hora de fazer backup no MySQL Workbench, o botão de confirmação fica escondida atrás da barra. Várias e várias vezes eu fui em configurações e utilizei a opção de ocultar a barra e várias e várias vezes eu fui em configurações para não ocultar a barra. Hoje eu faço diferente. Eu seleciono a opção Include Create Schema do painel Dump, depois eu desmarco a opção, depois dou um {TAB} e finalmente dou um {ENTER} para ativar o botão confirmar do painel do Dump do MySQL. O Windows 11 é ótimo, mas para melhorar a minha sugestão é colocar a opção "Ocultar a barra de tarefas por dois minutos", quando um usuário der um duplo clique na barra. Ou isso é possível, só eu que não sei como fazer?
  21. Eu sou um programador eventual e eu criei um formulário sem o botão de confirmar, e eu embuti a função submit() no último input do formulário, quando ele pede o histórico do lançamento contábil. Hoje eu estou arrependido da besteira que eu fiz, vou ter que tirar o comando que embuti no input do histórico e criar um outro botão para submeter o formulário. O problema do histórico é que eu não tenho todas as informações que eu preciso, e na hora que vou procurar em outra janela do navegador ou outro apicativo do Windows, o input presume que eu já terminei o serviço, faz o lançamento e vai para a tela de extrato. Quando vejo que a tela mudou, eu sou obrigado a abrir o documento no modo edição e completar o histórico. Isso é bastante constrangedor, mas agora eu sei qual a importância do botão confirmar nos formulários.
  22. Supondo que a tabela produtividade tenha os campos solucao, numero_processo e data_processo, a consulta simples seria Select * from produtividade order by data_processo desc Mas você está trabalhando com consulta agrupamento e aqui eu não consigo ver de onde vem as informações do campo ou variável notificação.
  23. Conversei com o Felix no Shopping Popular de Diadema, e ele me informou que é necessário saber como mapear a rede e trabalhar com o IP estático para poder redirecionar as portas do modem. Isso está fora da minha capacidade, por enquanto. Nesse meio tempo, eu perdi a funcionalidade do WampServer de tanto mexer nos arquivos httpd.conf e no httpd-vhosts.conf do Apache. Para consertar o WampServer, eu desinstalei do Windows 11. Eu fui no endereço WampServer, la plate-forme de développement Web sous Windows - Apache, MySQL, PHP, depois de clicar no WampServer 64 bits, eu cliquei na opção "you can download it directly". Abri o arquivo de instalação. Graças a Deus, o servidor voltou a funcionar no notebook. Com a ajuda do Google, também consegui fazer o celular acessar o servidor pela rede WiFi. Acrescentei a linha "required ip 192.168.0" no httpd-vhosts.conf, ele ficou assim: <VirtualHost *:80> ServerName localhost ServerAlias localhost DocumentRoot "${INSTALL_DIR}/www" <Directory "${INSTALL_DIR}/www/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require local #acesso pelo computador local Require ip 192.168.0 #acesso pela rede local </Directory> </VirtualHost> Durante dois anos, eu usei o túnel do ngrok para o celular acessar o servidor pela internet, mas ele não funciona mais. Eu pensei em usar o encaminhamento da porta para achar um outro caminho para o celular, mas por enquanto vou abandonar essa ideia.
  24. No Open Port Check Tool - Test Port Forwarding on Your Router (yougetsignal.com), o meu IP Externo é 189.54.219.174. Tentei usar a porta 10455, mas ele afirma que está fechado. No modem da Claro, defini assim: Server Name = localhost External Port Start = 10455 External Port End = 10455 Source IP Adress = 189.54.219.174 Protocol = TCP/UDP Internal Port Start = 80 Internal Port End = 80 Server IP Adress = 192.168.0.12 Wan Interface = wanbridge Ainda no modem da Claro, tenho IPV4 100.65.130.103, DNS Primário 181.213.132.2 e 181.213.132.3 (mas não estão sendo usados). A minha dúvida é saber se a porta 10455 está fechado lá no servidor "externo" ou se fiz uma tremenda besteira no meu servidor "interno". Eu uso Windows 11 com WampServer de 64 bits.
  25. O modal é coisa recente para mim. Hoje eu aprendi como colocar o modal no topo da tela e não no topo da página. Nesse caso, ao invés de usar position:absolute eu precisei mudar para position:fixed. O meu código menu.php ficou assim: <meta name="viewport" content="width=device-width, initial-scale=1"> <style> ul {margin: 0; padding: 0; list-style-type: none;} li {margin: 0; padding: 0; list-style-type: none;} th {border: 1px solid blue;} td {white-space: nowrap;} form {margin: 0;} .modal {display:none; position:fixed; background-color:#fefefe; border:1px solid;top:30%; padding:50px;} </style> <body ondblclick=divmodal.style.display="block"> <div id=divmodal class=modal onclick=divmodal.style.display="none"> <a href="orcamento.php">Orçamento</a><br> <a href="diario.php">Diário</a><br> <a href="balancete.php">Balancete</a><br> <a href="pagar.php">Pagar</a><br> <a href="pessoa.php">Pessoa</a><br> <a href="produto.php">Produto</a><br> <a href="apuracao.php">Apuração</a><br> </div>
×
×
  • Criar Novo...