
Frank K Hosaka
Membros-
Total de itens
1.532 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Eu olhei o arquivo php.ini [apache module] e lá eu vi error_reporting = E_ALL. O mistério ainda continua.
-
Simplifiquei o código, e só consegui salvar o xlsx com a ajuda do parâmetro FileFormat: Sub teste() Dim ws As Worksheet Dim Filename As String Set ws = ActiveSheet Filename = ThisWorkbook.Path & "\Venda de veículos.xlsx" On Error GoTo ErrorHandler ws.SaveAs Filename:=Filename, FileFormat:=xlOpenXMLWorkbook MsgBox "Arquivo salvo com sucesso como " & Filename Exit Sub ErrorHandler: MsgBox "Erro ao salvar o arquivo: " & Err.Description End Sub
-
cdn.tailwindcss.com should not be used in production
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
O <input type="file"> produz um quadro com a frase "Escolha o arquivo" e ali adiante outra mensagem "nenhum arquivo selecionado". O Copilot me passou uma dica de como esconder a segunda parte do marcador, mas ele escondeu todo o input, no lugar colocou um botão personalizado, e acrescentou um código em JavaScript. Eu achei a dica do Copilot muito trabalhoso, então decidi improvisar por conta própria, usando apenas o Tailwind. Não ficou bom, dá para ver que se trata de gambiarra: <?php include 'menuView.php'; ?> <script>btmenu.innerHTML="Nota Faltante";document.title="Nota Faltante"</script> <script src="https://cdn.tailwindcss.com"></script> <div> <form method="post" enctype="multipart/form-data" action="?Bling.faltanteSelecionado"> <div class="flex"> <input type="file" name="pasta" class="w-[133px] font-semibold" onchange=submit()> <div class="font-semibold bg-gray-200 border-t-2 border-r-2 border-b-2 border-black px-1">zipado da Bling</div> </div> </form> </div> -
Hoje eu usei o cdn da Tailwind no Laravel, e ele funcionou tanto no notebook bem como no Hostinger, só o JavaScript reclamou que eu não deveria usar o cdn. arquivo route > web.php Route::view('/','index'); arquivo reources > views > index.blade.php <!-- esse arquivo pode ser testado no PHP, mas se não mudar o nome do arquivo, terá que executar localhost/index.blade --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.tailwindcss.com"></script> <body class="w-[500px] m-0 m-auto"> <table class="table table-striped"><!-- tabela zebrada com Bootstrap --> <tr><th class="ml-2">Coluna 1<th>Coluna2 <tr><td>2<td>2 <tr><td>3<td>4 </table> <table class="min-w-full"><!-- tabela zebrada com Tailwind --> <tr class="bg-gray-200"><th>Coluna 1<th>Coluna2 <?php for($i=1;$i<=10;$i++): ?> <tr class="odd:bg-gray-200"><td><?=$i?><td><?=$i?> <?php endfor; ?> </table>
-
Consultar Tabela no Access 2019 com chamada de Public Function na Query SQL
pergunta respondeu ao Flavio Costa de Frank K Hosaka em Access
Eu consultei o Copilot, e ele disse que é possível o PERL executar uma macro do Microsoft Access. Ou seja, se a sua consulta funciona no Microsoft Access, você precisa transformar essa consulta numa macro e pedir para o PERL executar a macro: #!/usr/bin/perl use strict; use warnings; use Win32::OLE; # Caminho para o arquivo .mdb my $caminho = 'C:/caminho/para/seu/arquivo.mdb'; # Inicializa o objeto Access my $access = Win32::OLE->new('Access.Application', 'Quit') or die "Não foi possível iniciar o Access: $!"; # Abre o banco de dados my $banco = $access->OpenCurrentDatabase($caminho) or die "Não foi possível abrir o banco de dados: " . $access->LastError(); # Executa a subroutine $banco->RunMacro('NomeDaSubroutine'); # Fecha o banco de dados e o Access $banco->CloseCurrentDatabase(); $access->Quit; Acho que o mais sensato é criar a função calc_idade2 no ambiente do PERL, ou seja, você estuda a fonte original do Access e depois codifica na gramática do PERL. O máximo que dá para fazer com as conexões ODBC é acessar informações contidas nas tabelas e não todos os recursos do Microsoft Access. -
Ontem, eu pedi para a Hostinger usar o PHP 8.4, pois eu não vi nenhum problema aqui no Notebook. Hoje eu aprendi que o Notebook é uma coisa, mas o Hostinger é coisa totalmente diferente. Aqui no Notebook, o seguinte comando gera um arquivo CSV: fputcsv($arquivo, $dados[0]); Mas o PHP 8.4 do Hostinger é diferente, ele reclama que o comando está depreciado e que preciso colocar os parâmetros do $escape, assim: fputcsv($arquivo, $dados[0],',','"','\\'); Eu consegui os parâmetros graças ao Copilot. O meu programa orçamento não gera e nem tem credencial para emitir uma NFC-e, o máximo que eu consegui fazer é montar um pedido nos moldes da Bling, depois vou na Bling, importo o pedido, e em seguida emito a NFC-e. O mais comum é o Cupom Fiscal, mas em São Paulo, você precisa do SAT para autenticar o cupom. Já o NFC-e é a antiga NF Série D, na versão eletrônica, e ele não precisa do SAT para ser autenticado e a Bling não tem uma versão para emitir o Cupom Fiscal. A Bling tem rotina para gerar pedido, mas achei oportuno fazer um Orçamento em PHP para facilitar na hora de usar o tablet ou celular: <?php class Orcamento { function apagarBling($pedido) { (new Conn)->update("tbpedido set bling=null where ped=$pedido"); return $this->inicio($pedido); } function bling($pedido) { $pBling=$_GET['pBling']; $verificar=(new Conn)->select("count(bling) as contagem from tbpedido where bling=$pBling")[0]->contagem; if($verificar) { echo "<h1>Pedido Bling $pBling já foi criado. <a href=?Orcamento.inicio>Voltar</a></h1>"; exit; } (new Conn)->update("tbpedido set bling=$pBling where ped=$pedido"); $contato="Consumidor Final"; $itens=(new Conn)->select("* from tbhistped where ped=$pedido"); $previa=(new Conn)->select("sum(subtotal) as soma from tbhistped where subtotal < 0 and ped=$pedido")[0]->soma; $desconto=$previa ? abs($previa) : 0; $total=(new Conn)->select("total from tbpedido where ped=$pedido")[0]->total; $data=date('d/m/Y',strtotime((new Conn)->select("dia from tbpedido where ped = $pedido")[0]->dia)); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $arquivo = fopen("$pBling.csv", "w"); fputcsv($arquivo, $dados[0],',','"','\\'); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha,',','"','\\'); } } fclose($arquivo); if (file_exists("$pBling.csv")) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$pBling.csv")); header('Content-Length: ' . filesize("$pBling.csv")); readfile("$pBling.csv"); unlink("$pBling.csv"); } } function confirmar() { $ped=$_POST['ped']; if(!empty($_POST['dinheiro'])) { $dinheiro=str_replace(',','.',$_POST['dinheiro']); $troco=str_replace(',','.',$_POST['troco']); } else { $dinheiro=0; $troco=0; } if(isset($_POST['cartao'])){$cartao=1;} else {$cartao=0;} if(isset($_POST['pix'])){$pix=1;} else {$pix=0;} if(!empty($_POST['parcial'])) { if($dinheiro!==0) { echo "<script>location.replace('orcamento.php')></script>";exit; } $dinheiro=$_POST['parcial']; $troco=0; } $horavenda=date('Y-m-d H:i'); (new Conn)->update("tbpedido set horavenda='$horavenda',dinheiro=$dinheiro, troco=$troco,cartao=$cartao,pix=$pix where ped=$ped"); return $this->inicio(); } function corrigir($ped) { (new Conn)->update("tbpedido set horavenda=null,horavenda=null,dinheiro=null, troco=null,cartao=0,pix=0 where ped=$ped"); return $this->inicio(); } function excluir($id) { $ped=$_GET['pedido']; (new Conn)->delete("tbhistped where id=$id"); $novoTotal=(new Conn)->select("sum(subtotal) as soma from tbhistped where ped=$ped")[0]->soma; if($novoTotal==null) { $novoTotal='null'; } (new Conn)->update("tbpedido set total=$novoTotal where ped=$ped"); return $this->inicio($ped); } function historicoOrc($hist) { $where=""; if($hist) { $ped=$_SESSION['referencia']+$hist; $where="where ped <= $ped"; } $pedidos=(new Conn)->select("* from tbpedido left join tbpessoa on tbpedido.codp = tbpessoa.codp $where order by ped desc limit 20"); $_SESSION['referencia']=$pedidos[0]->ped; return view('orcamentoHist',['pedidos'=>$pedidos]); } function inicio($pedido = null) { $prod=(new Conn)->select("* from tbprod order by prod"); $maquina=strpos($_SERVER['HTTP_USER_AGENT'],"Windows"); $hoje=date('Y-m-d'); $where=""; if($pedido) { $where="where ped=$pedido"; $vr['codprod']=(isset($_SESSION['codprod'])) ? $_SESSION['codprod'] : null; if($vr['codprod']) { $codprod=$vr['codprod']; $produto=(new Conn)->select("* from tbprod where codprod=$codprod")[0]; $vr['prod']=$produto->prod; $vr['un']=$produto->un; $custo=$produto->custo; $margem=$produto->marg; $vr['preço']=pvenda($custo,$margem); } else { unset($_SESSION['codprod']); $vr=['ped'=>'','diaped'=>$hoje,'totalped'=>'','codp'=>'','pessoa'=>'', 'end'=>'','cnpj'=>'','tel'=>'','nota'=>'','codprod'=>'','un'=>'', 'prod'=>null,'preço'=>'','horavenda'=>'','bling'=>'']; } } $ped=(new Conn)->select("* from tbpedido $where order by ped desc")[0]; $vr['ped']=$ped->ped; $_SESSION['ped']=$ped->ped; $vr['diaped']=$ped->dia; $vr['horavenda']=$ped->horavenda; $vendido=($ped->horavenda) ? true : false; $vr['totalped']=$ped->total; $vr['bling']=$ped->bling; $vr['codp']=$ped->codp; if(isset($_SESSION['codp'])) { $vr['codp']=$_SESSION['codp']; unset($_SESSION['codp']); } if($vr['codp']) { $pessoa=(new Conn)->select("* from tbpessoa where codp=". $vr['codp'])[0]; $vr['pessoa']=$pessoa->pessoa; $vr['end']=$pessoa->end; $vr['cnpj']=$pessoa->cnpj; $vr['tel']=$pessoa->tel; $vr['nota']=$pessoa->nota; } $histped=(new Conn)->select("tbhistped.id,tbhistped.ped, tbhistped.codprod, tbhistped.qt as qt, tbhistped.unitario as unitario, tbhistped.subtotal, tbprod.prod as prod, tbprod.un as un from tbhistped inner join tbprod on tbhistped.codprod = tbprod.codprod and tbhistped.ped = $ped->ped order by tbhistped.id"); return view('orcamentoView',['vr'=>$vr,'histped'=>$histped,'prod'=>$prod, 'maquina'=>$maquina,'vendido'=>$vendido]); } function menu() { unset($_SESSION['codprod']); unset($_SESSION['codp']); unset($_SESSION['pessoa']); return $this->inicio(); } function novo() { $pedido=(new Conn)->select("* from tbpedido order by ped desc")[0]; $ped=$pedido->ped; $total=$pedido->total; if($total!==null) { $ped++; $dia=date('Y-m-d'); (new Conn)->insert("tbpedido (dia,ped) values ('$dia',$ped)"); } return header("location:?Orcamento.inicio.$ped"); } function pedido($pedido) { $_SESSION['ped']=$pedido; return $this->inicio($pedido); } function pessoa($pedido) { $_SESSION['end']="?Orcamento.pessoaSelecionada.$pedido"; if(isset($_GET['codp'])){ $codp=$_GET['codp']; return header("location:?pessoa.inicio.$codp"); } return header("location:?Pessoa.inicio"); } function pessoaSelecionada($pedido) { $codp=$_SESSION['codp']; (new Conn)->update("tbpedido set codp = $codp where ped=$pedido"); return $this->inicio($pedido); } function produto() { $pedido=$_SESSION['ped']; $_SESSION['end']="?Orcamento.inicio.$pedido"; $produto=str_replace(" ","%",$_POST['produto']); $tamanho=strlen($produto); $posicao=strpos($produto,":"); if($posicao==0) { if($produto!=="") { $_SESSION['criterio']="where prod like '%$produto%' order by prod"; } return header("location:?Produto.inicio"); } $_SESSION['codprod']=substr($produto,$posicao+1,$tamanho-$posicao); return $this->inicio($_SESSION['ped']); } function qt() { $qt=deca($_POST['qt']); $codprod=$_SESSION['codprod']; unset($_SESSION['codprod']); if($qt==0 || $qt=='') { return $this->inicio(); } $produto=(new Conn)->select("* from tbprod where codprod=$codprod")[0]; $ped=$_SESSION['ped']; $un=$produto->un; $custo=$produto->custo; $margem=$produto->marg; $unitario=pvenda($custo,$margem); $subtotal=$qt*$unitario; (new Conn)->insert("tbhistped (ped,codprod,un,unitario,subtotal,qt) values ($ped,$codprod,'$un',$unitario,$subtotal,$qt)"); $novoTotal=(new Conn)->select("sum(subtotal) as soma from tbhistped where ped=$ped")[0]->soma; (new Conn)->update("tbpedido set total=$novoTotal where ped=$ped"); return $this->inicio($ped); } }
-
Durante quatro horas fiz vários testes para ver o que eu fiz de errado no código PHP, mas não consegui encontrar nada. Até que eu fui tentar fazer diretamente no terminal, no Workbench MySQL: update tbnf set custoanterior=15.8, e o MySQL reclamou que os dados estavam truncados. Mudei o tipo do campo de float para double para int, mas nada disso resolveu. Finalmente decidi estudar toda a tabela, e dentro do campo codprod encontrei algo assim <b>Ver</ b>, isso é uma gambiarra HTML que eu coloquei dentro de um campo tipo varchar. O Copilot me explicou que o varchar é só para texto puro e que não pode usar o marcador HTML. Para corrigir o problema, ele sugeriu mudar o tipo do campo para TEXT. Eu imaginei que o problema era a consulta, mas acabei descobrindo que a tabela é que estava detonada, algo parecido com o PHP, se você abre um bloco {, o PHP não faz nada se você não fechar o bloco com }. Resumindo, VARCHAR e TEXT é quase a mesma coisa, você só não pode usar marcador HTML no VARCHAR. Agora eu entendo porque é tão difícil estudar o banco de dados.
-
Hoje apareceu uma nota fiscal fora do estado, onde eu tive que calcular o ICMS substituição tributária e o ICMS diferencial de alíquota. Eu fiz o cálculo usando o Excel, e também codifiquei o código no PHP para calcular a mesma coisa. Deu uma diferença de R$ 0,01. O Copilot me ofereceu quatro dicas que não funcionaram. Então, ele apresentou o $epsilon. O Copilot é engenhoso! <?php echo round(76.25*0.18-9.15,2) . "<br>"; echo number_format(76.25*0.18-9.15,2,'.','') . "<br>"; bcscale(2); $parte1=bcmul('76.25','0.18'); echo bcsub($parte1,'9.15') . "<br>"; $parte1 = 76.25 * 0.18; $parte2 = $parte1 - 9.15; echo number_format($parte2,2,'.','') . "<br>"; $epsilon = 0.00001; $valor=76.25*0.18-9.15; echo round($valor + $epsilon,2);
-
Eu raramente uso chave externa, pois eu não sei qual a categoria do produto. Aconselho a fazer o mesmo, não crie a chave externa. Mas se você sabe a categoria do produto, e você tem chave externa para ela, você é obrigado a incluir a categoria do produto, toda vez que for incluir um produto, assim: CREATE DEFINER=`root`@`localhost` PROCEDURE `testandoNulo`() BEGIN DROP TABLE IF EXISTS tb_produtos; DROP TABLE IF EXISTS tb_categoria; CREATE TABLE tb_categoria ( id_categoria INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, desc_categoria VARCHAR(255) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; INSERT INTO tb_categoria (desc_categoria) VALUES ('Produtos que envolvem dispositivos eletrônicos e inovações tecnológicas.'), ('Roupas e acessórios que seguem tendências de estilo e design.'), ('Produtos e tratamentos para cuidados pessoais e estética.'); CREATE TABLE tb_produtos ( id_produtos INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, desc_produtos VARCHAR(255) NOT NULL, valor DECIMAL(10,2), id_categorias INT(11) NOT NULL, CONSTRAINT fk_id_categoria FOREIGN KEY (id_categorias) REFERENCES tb_categoria(id_categoria) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO tb_produtos (desc_produtos, valor, id_categorias) VALUES ('Dispositivo portátil que combina funções de telefone, computador e câmera em um único aparelho.', 600, 1), ('Peça de roupa feminina que cobre o corpo desde os ombros até a parte inferior das pernas.', 80, 2), ('Produto cosmético usado para manter a pele hidratada e suave.', 30, 3); END
-
Calcular a pontuação e classificar candidatos comparando campos de tabelas
pergunta respondeu ao Lúcio Flávio da Silva Sales de Frank K Hosaka em MySQL
CREATE DEFINER=`root`@`localhost` PROCEDURE `calcular_notas`() BEGIN DROP TABLE IF EXISTS aluno; DROP TABLE IF EXISTS resposta; DROP TABLE IF EXISTS gabarito; CREATE TABLE `aluno` ( `id` int NOT NULL AUTO_INCREMENT, `nome` varchar(80) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `resposta` ( `Id` int NOT NULL AUTO_INCREMENT, `Aluno_id` int DEFAULT NULL, `Questao` int DEFAULT NULL, `Resposta` varchar(45) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `gabarito` ( `Id` int NOT NULL AUTO_INCREMENT, `Questao` int DEFAULT NULL, `Solucao` varchar(45) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; INSERT INTO aluno (Nome) values ('João'),('José'),('Lucas'); INSERT INTO resposta (Aluno_Id,Questao,Resposta) values (1,1,'A'),(1,2,'D'),(1,3,'E'),(1,4,'C'),(1,5,'B'), (2,1,'C'),(2,2,'E'),(2,3,'E'),(2,4,'C'),(2,5,'A'),(3,1,'B'),(3,2,'D'),(3,3,'A'),(3,4,'A'),(3,5,'A'); INSERT INTO gabarito (Questao, Solucao) VALUES (1, 'C'),(2, 'D'),(3, 'E'),(4,'C'),(5,'A'); SELECT r.Aluno_Id, a.Nome, COUNT(*) AS acertos FROM resposta r JOIN gabarito g ON r.Questao = g.Questao JOIN aluno a ON a.id = r.Aluno_id WHERE r.Resposta = g.Solucao GROUP BY r.Aluno_Id; END -
Eu acho bem bacana o roteador do Laravel, e eu pensei fazer o mesmo no PHP. O Copilot sugeriu criar o arquivo .htaccess: RewriteEngine On RewriteRule ^([^/]+)/?$ index.php [L] No teste que eu fiz no Hostinger, não precisei do arquivo .htaccess O meu roteador ficou assim: <?php class Teste { function teste() {echo "olá mundo!";} function beleza($alfa = null) { if($alfa){echo $alfa;} else {echo "o mundo e belo";} } } $request = $_SERVER['REQUEST_URI']; $script_name = $_SERVER['SCRIPT_NAME']; $base = str_replace(basename($script_name), '', $script_name); $path = str_replace($base, '', $request); $path = trim($path, '/'); if(strpos($path,'?')===false){$path .= '?';} list($before,$after)=explode('?',$path,2); $rota=['teste'=>'Teste.teste','beleza'=>'Teste.beleza']; $segmentos=explode('.',$rota[$before]); $nomeControle=$segmentos[0]; $metodo=$segmentos[1]; $parametro=$after ?? null; (new $nomeControle())->$metodo($parametro); ?> Ele funcionou quando escrevi localhost/astudy/teste, localhost/astudy/beleza, localhost/astudy/beleza?variavel=15
-
Depois de cinco anos, graças ao Copilot, consegui tirar o ícone do calendário do <input type="date"> <?php $hoje=date('Y-m-d'); ?> <style> input[type="date"]::-webkit-calendar-picker-indicator { display: none} input {border: none; width:80px} body {width:630px;margin:0 auto;margin-top:200px} </style> <input type="date" value="<?=$hoje?>" onclick="this.showPicker()">
-
Resolução de Equações Diferenciais
pergunta respondeu ao Amarildo Fernando Gonçalve de Frank K Hosaka em Python
[copilot.microsoft.com] arquivo diferencial.py import numpy as np import matplotlib.pyplot as plt # Definindo a função f(x, y) def f(x, y): return 1/x**2 - 2*y # Método de Euler para resolver a equação diferencial def euler_method(f, x0, y0, h, x_end): x = np.arange(x0, x_end + h, h) y = np.zeros(x.size) y[0] = y0 for i in range(1, x.size): y[i] = y[i-1] + h * f(x[i-1], y[i-1]) return x, y # Condições iniciais e parâmetros x0 = 1 y0 = -1 h = 0.01 x_end = 2 # Resolvendo a equação diferencial x, y = euler_method(f, x0, y0, h, x_end) # Plotando a solução plt.plot(x, y, label="Solução de y' = 1/x^2 - 2y") plt.xlabel('x') plt.ylabel('y') plt.title("Solução da Equação Diferencial") plt.legend() plt.grid(True) plt.show() -
Projeto de janela mostrando possibilidades de informações
pergunta respondeu ao m4nu de Frank K Hosaka em VBA
Eu criei um formulário UserForm1 e dentro dele coloquei um combobox ComboBox1, e no código VBA coloquei o seguinte código: Private Sub UserForm_Initialize() ' Define o intervalo de células A1:A3 como fonte de dados para o ComboBox ComboBox1.List = Sheets("Plan1").Range("A1:A3").Value End Sub Private Sub ComboBox1_Change() ' Coloca o valor selecionado na célula B1 da planilha "Plan1" Sheets("Plan1").Range("B1").Value = ComboBox1.Value End Sub Também criei um código para a planilha Plan1: Sub MostrarUserForm() UserForm1.Show End Sub Para testar eu coloquei alfa, beta e gama nas células a1, a2, a3. Pedi para executar a macro MostrarUserForm, e o valor selecionado foi colocado na célula B1. -
Não se trata de um laço for, cada linha representa um link, ou uma informação. O problema é que a informação precisa de dois ou três <div>, mas eu não consegui alinhar as <div> onde eu queria, assim apelei para a gambiarra. Muito tempo depois de eu publicar o código, descobri que o CSS Tailwind tem o width em pixels, e assim eu não preciso mais da gambiarra: arquivo outrosView.blade.php @include('menuView') <script>btmenu.innerHTML='Outros';document.title="Outros"</script> <div class="bg-gray-200"><a href=estoqueBaixar>Baixar Estoque</a></div> <div><a href=balanceteTBW>Criar tbw</a></div> <div class="bg-gray-200"><a href=produtoDescontinuar>Descontinuar Produto</a></div> <div><a href=estoqueDiferenca>Diferença no Estoque</a></div> <div class="bg-gray-200"><a href=blingDiferenca>Diferença na Bling</a></div> <div><a href=estoqueEntrada>Entrada de Produtos</a></div> <div class="bg-gray-200"><a href=outrosEtiqueta>Etiquetas</a></div> <div><a href=outrosMegaSena>Mega-Sena</a></div> <div class="bg-gray-200"><a href=diarioMercado>Mercado Pago</a></div> <div><a href=nfInicio>Nota do Fornecedor</a></div> <div class="bg-gray-200"><a href=blingFalta>Nota Faltante</a></div> <div class=flex> <div class=w-[200px]>session('codp')</div> <div>{{$vetor['codp']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('codprod')</div> <div>{{$vetor['codprod']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('criterio')</div> <div class=truncate>{{$vetor['criterio']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('criterioPessoa')</div> <div>{{$vetor['criterioPessoa']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('dia')</div> <div>{{dbr($vetor['dia'])}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('end')</div> <div>{{$vetor['end']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('id')</div> <div>{{$vetor['id']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('lcto')</div> <div>{{$vetor['lcto']}}<td></div> </div> <div class="flex"> <div class=w-[200px]>session('pessoa')</div> <div>{{$vetor['pessoa']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoBaixaEstoque')</div> <div class=w-[100px]>{{$baixa}}</div> <div class='text-red-600 text-right'>{{dec($valorBaixa)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('lctoAcertoMais')</div> <div class=w-[100px]>{{$mais}}</div> <div class='text-red-600 text-end'>{{dec($valorMais)}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoAcertoMenos')</div> <div class=w-[100px]>{{$menos}}</div> <div class='text-red-600 text-right'>{{dec($valorMenos)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('diaAcerto')</div> <div>{{dbr($diaAcerto)}}</div> </div>
-
Eu ainda não sei fazer a roda, você tem o tutorial, de preferência em PHP?
-
Imagine que você vende repolho por peça, mas o seu fornecedor vende num saco de 10 peças. Eu tive um trabalho danado para adaptar o banco de dados ao XML do fornecedor. Imagine que apareceu outro fornecedor que vende por peça e não por saco. E assim foi o meu pesadelo no último ano. Hoje eu tive a brilhante ideia de adaptar o XML ao banco de dados. A ideia é pegar o XML, colocar tudo numa tabela provisória (tbnf), alterar a quantidade na unha, e depois mandar para a tabela definitiva (tbhistprod). Ele ficou assim: arquivo NF.php <?php class NF{ function atualiza(){ $previa=(new Conn)->select("* from tbnf"); extract($_SESSION['vetor']); return view('NFview',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]); } function custo(){ $custoAtual = $_POST['custoAtual']; $codprod = $_POST['codprod']; $previa=(new Conn)->select("marg from tbprod where codprod=$codprod")[0]; $venda=pvenda($custoAtual,$previa->marg); $class="class=text-end"; (new Conn)->update("tbnf set custoanterior=$custoAtual, class='$class' where codprod=$codprod"); return (new Conn)->update("tbprod set custo=$custoAtual, venda=$venda where codprod = $codprod"); } function incluir(){ $lcto=$_POST['lcto']; $verifica=count((new Conn)->select("* from tbhistprod where lcto=$lcto")); if($verifica){ $mensagem="<h1>Nota já lançada. <a href=?NF.atualiza>Voltar</a></h1>"; return view('mensagemView',['mensagem'=>$mensagem]); } $dia=(new Conn)->select("dia from tbdiario where lcto=$lcto")[0]->dia; $matriz=(new Conn)->select("* from tbnf"); foreach($matriz as $vetor){ (new Conn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto) values ($vetor->codprod,'$dia',$vetor->qt,$vetor->custototal,$vetor->codp,$lcto)"); } return header("location:?Diario.inicio.$dia"); } function inicio(){return view('NFarquivo');} function qt(){ $qt=$_POST['qt']; $id=$_POST['id']; $previa=(new Conn)->select("* from tbnf where id=$id")[0]; $novoClass=$previa->class; $custoAtual=intval($previa->custototal/$qt*100)/100; if($custoAtual!==$previa->custoanterior){ $novoClass="class=\"text-danger text-end\""; } (new Conn)->update("tbnf set class='$novoClass', custoatual=$custoAtual, qt=$qt where id=$id"); return $this->atualiza(); } function selecionada(){ (new Conn)->delete("tbnf"); (new Conn)->exec("alter table tbnf auto_increment = 1"); $nfe=simplexml_load_file($_FILES['arquivo']['tmp_name']); $itens=$nfe->NFe->infNFe->det; $difAliqICMS=0; $aliquotaInterna=0.18; foreach ($itens as $item){ if ((string)$item->prod->CFOP == 6102){ $vBC = (string)$item->imposto->ICMS->ICMS10->vBC; $vICMS = (string)$item->imposto->ICMS->ICMS10->vICMS;; $difAliqICMS += intval(($vBC * $aliquotaInterna - $vICMS) * 100) / 100; } } $vNF = (string)$nfe->NFe->infNFe->total->ICMSTot->vNF; $nNF = (string)$nfe->NFe->infNFe->ide->nNF; $xNome = (string)$nfe->NFe->infNFe->emit->xFant; $nome = explode(" ", $xNome)[0]; $codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp; $soma=0; foreach ($itens as $item){ // no campo codforn uso a primeira letra para identificar o fornecedor $codforn = (string)$item->prod->cProd; $criterio= $nome[0].$codforn; $consulta = (new Conn)->select("codprod from tbprod where codforn like '%$criterio%' "); $codprod = 'Verificar'; if (count($consulta) == 1){ $codprod = $consulta[0]->codprod; } $produto = (string)$item->prod->xProd; $quantidade = (string)$item->prod->qCom; if (is_numeric($codprod)){ $produtoDobrado = [506, 507, 508, 509, 510, 519, 1768, 1770, 1772]; if (in_array($codprod, $produtoDobrado)){ $quantidade = 2 * $quantidade; } $produtox5=[1798]; if (in_array($codprod,$produtox5 )){ $quantidade = 5 * $quantidade; } $produtoX10 = [2192, 2190,1782,2456]; if (in_array($codprod, $produtoX10)){ $quantidade = 10 * $quantidade; } } $vICMSST = ((string)$item->imposto->ICMS->ICMS10->vICMSST) ? (string)$item->imposto->ICMS->ICMS10->vICMSST : null; $difAliq = 0; if ((string)$item->prod->CFOP == 6102){ $vBC = (string)$item->imposto->ICMS->ICMS10->vBC; $vICMS = $item->imposto->ICMS->ICMS10->vICMS; $difAliq = intval(($vBC * $aliquotaInterna - $vICMS) * 100) / 100; } $vIPI = 0; if ((string)$item->imposto->IPI->vIPI){ $vIPI = (string)$item->imposto->IPI->vIPI; } $vProd = (string)$item->prod->vProd; $valorTotal = $vProd + $vICMSST + $difAliq + $vIPI; $soma += $valorTotal; $class = "class=text-end"; if (is_numeric($codprod)){ $custoAtual = intval($valorTotal / $quantidade * 100) / 100; $consulta = (new Conn)->select("custo from tbprod where codprod=$codprod"); $custoAnterior = $consulta[0]->custo; if (abs($custoAnterior - $custoAtual) > 0.02){ $class = "class=\"text-end text-danger\""; } } (new Conn)->insert("tbnf (codforn,codprod,prod,qt,custoatual,custoanterior,class,custototal,codp) values ($codforn,$codprod,'$produto',$quantidade,$custoAtual,$custoAnterior,'$class',$valorTotal,$codp)"); } $previa=(new Conn)->select("* from tbnf"); $_SESSION['vetor']=['nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]; return view('NFview',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]); } } arquivo NFarquivo.php <?php require 'menuView.php' ?> <script>btmenu.innerHTML="Nota do Fornecedor";document.title="Nota do Fornecedor"</script> <div class=mb-3> <form method=post enctype="multipart/form-data" action="?NF.selecionada"> <label for=arquivo class=form-label>Escolha o arquivo XML</label> <input type=file name=arquivo class=form-control id=formfile required onchange=submit()> </form> </div> arquio NFView.php <?php include('menuView.php'); ?> <script> btmenu.innerHTML='NF Fornecedor';document.title="NF Fornecedor" function atualizar(custoAtual,custoAnterior,codprod){ confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior) if(confirma){ xmlhttp=new XMLHttpRequest() url = "?NF.custo" formData = new FormData() formData.append('custoAtual',custoAtual) formData.append('codprod',codprod) xmlhttp.open("POST",url,true) xmlhttp.send(formData) location.replace('?NF.atualiza') } } </script> <table class='table table-striped table-sm'> <tr class=fw-semibold><td colspan=3>NF <?=$nNF." ".substr($xNome,0,4)." codp ".$codp?><td><td><td class=text-end><?=dec($vNF)?> <?php if($difAliqICMS!==0): ?> <tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td class=text-end><?=dec($difAliqICMS)?> <tr class=fw-semibold><td><td><td>Total a conferir<td><td class=text-end><?=dec($difAliqICMS+$vNF)?> <?php endif; ?> </table> <table class="table table-striped table-sm"> <th style="max-width:50px">Cforn <th style="width:50px"> <th style="width:360px">Produto <th class=text-end>Qt <th class=text-end>Custo <th class=text-end>Total <?php foreach($previa as $p): ?> <tr><td style="max-width:50px" class=text-end><?=$p->codforn?> <td style="max-width:50px" class=text-end><?=$p->codprod?> <td style="max-width:360px" class="overflow-hidden" ><?=$p->prod?> <td> <form method=post action=?NF.qt> <input name=qt value='<?=$p->qt?>' class="inv text-end" size='1' onchange=submit()> <input type=hidden name=id value='<?=$p->id?>'> </form> <td <?=$p->class?> onclick="atualizar(<?=$p->custoatual?>,<?=$p->custoanterior?>,<?=$p->codprod?>)"><?=dec($p->custoatual)?> <td class=text-end><?=dec($p->custototal)?> <?php endforeach; ?> <tr class=fw-semibold><td><td><td>Total dos itens<td><td></td><td class=text-end><?=dec($soma)?> </table> <div> Enviar tudo para o banco de dados <form action=?NF.incluir method=post> <input name=lcto placeholder="Número do Lançamento" required> <input type=submit> </form> </div>
-
Atualmente eu uso o recurso do PHP chamado DOMDocument para obter as informações que eu preciso de uma nota fiscal eletrônica. Ele funciona, mas o VS Code reclama que estou usando um método que ele desconhece. Para contornar o problema, pedi ajuda para o Copilot e cheguei no simplexml do PHP: <?php // Caminho do arquivo XML $arquivoXML = 'nfeletronica.xml'; // Verifica se o arquivo existe if (file_exists($arquivoXML)) { // Carrega o arquivo XML $xml = simplexml_load_file($arquivoXML); // Acessa o array [det] dentro de infNFe $detArray = $xml->NFe->infNFe->det; // Itera sobre cada elemento do array [det] echo '<table><th>Código<th>Descrição<th>Qt<th>Total'; foreach ($detArray as $det) { echo "<tr><td>".(string)$det->prod->cProd; echo "<td>".(string)$det->prod->xProd; echo "<td>".(string)$det->prod->qCom; echo "<td>".(string)$det->prod->vProd; } echo '</table>'; } else { // Exibe uma mensagem de erro se o arquivo não existir exit('Falha ao abrir o arquivo XML.'); } ?>
-
Eu tenho esse código <?php session_start(); if (!isset($_SESSION['nome'])) { header("location:./"); exit; } ?> Ele funciona no notebook. Se eu escrevo "localhost/frank/revisao", ele muda para "localhost/frank/". O meu problema é lá na Hostinger. Se eu escrevo, frank.com/revisao, ele permanece do mesmo jeito. Já usei o comando location.replace( ) do JavaScript e outras dezenas de sugestões do Copilot, mas nada deu certo.
-
<div class="whitespace-nowrap overflow-auto px-2"><?= $lcto->hist ?></div> Ele fica um pouco desalinhado, dá para consertar, diminuindo o tamanho em pixel do campo histórico, mas aí apareceram vários históricos com o recurso da barra deslizante, então, achei melhor do jeito que está. Agora estou trabalhando com um <body class="w-[600px]">, é o que cabe na tela do celular, no modo paisagem.
-
O meu irmão não se deu bem com a impressora térmica para emitir orçamento, ele disse que a impressora só é boa para emitir nota fiscal ao consumidor eletrônica (NFCe). Ele decidiu comprar uma impressora a laser, o HP 107 w. Levei uma hora para configurar a impressora, eu fiz a besteira de conectar o cabo de dados da impressora com o notebook. Hoje tudo é diferente, não é mais necessário o cabo de dados, mas enfim consegui conectar a impressora na rede WiFi. O pesadelo foi na hora de adaptar o código PHP para a nova impressora. Eu e o Copilot gastamos oito horas para fazer o serviço de impressão funcionar. Depois de muita tentativa e erro, pedi para o Copilot começar do zero, tentar imprimir "Olá mundo" pelo Android, e deu certo. Esse foi o núcleo do trabalho, e pouco a pouco fui acrescentando o resto do serviço. O problema foi na hora de usar o comando JavaScript window.onafterprint(), é justamente esse comando é que estava detonando todo o serviço. O Copilot teve a genial ideia de criar o botão "Concluir" para substituir o serviço do afterprint. Outro serviço que não deu certo foi window.scrollTo. Resumindo, não deu para automatizar tudo, o que o JavaScript não conseguiu fazer, eu joguei nas costas do usuário: <?php include('menuView.php'); ?> <style> @media print {.no-print { display: none; }} .print-area {text-align: center;margin: 20px;} </style> <div class="print-area"> <table style="margin-left:420px"> <tr class=fw-semibold><td colspan=7>Quitanda do Frank - Praça Castelo Branco 123 <tr class=fw-semibold><td colspan=7>Pedido <?=$ped?> de <?=dbr($itens[0]->dia)?> <?php foreach($itens as $item): ?> <tr><td colspan=7><?=$item->prod?> <tr><td class=text-end><?=$item->qt?> <td class=text-end><?=$item->un?> <td>x<td class=text-end><?=dec($item->unitario)?> <td>=<td class=text-end><?=dec($item->subtotal)?> <?php endforeach; ?> <tr class=fw-semibold><td>Total<td><td><td><td><td class=text-end><?=dec($itens[0]->total)?> </div> <div class="no-print"> <button onclick="imprimir()">Imprimir</button> <button onclick="concluir()">Concluir</button> </div> <script> document.addEventListener("DOMContentLoaded", function() { // Adiciona a classe no-print ao elemento cabecalho var cabecalho = document.querySelector('#cabecalho'); if (cabecalho) { cabecalho.classList.add('no-print'); } }); function imprimir() { setTimeout(function() { window.print(); }, 500); } function concluir() { location.replace("?Orcamento.inicio.<?=$ped?>"); } </script> </body> </html>
-
Hoje descobri que um <body> com um width:600px é o ideal para trabalhar com um celular, no modo paisagem, ele é um espaço bem apertado, principalmente se você tiver 9 campos para exibir em cada linha. Então decidi exibir apenas 4 campos e ocultar os demais. Para dispensar o JavaScript para mostrar ou ocultar a <div> usei o marcador <details>, assim: <?php $dados = [['cod'=>1,'desc'=>"maçã"],['cod'=>2,'desc'=>"pera"]]; ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Exemplo de Alternância de Divs</title> <script src="https://cdn.tailwindcss.com"></script> </head> <style> summary {list-style:none} </style> <body class="p-4"> <?php foreach($dados as $dado): ?> <details class="mb-4"> <summary class="cursor-pointer"><?=$dado['cod']?></summary> <div class="p-4 bg-gray-100"> <?=$dado['desc']?> </div> </details> <?php endforeach; ?> </body> </html>
-
Hoje de manhã, o meu irmão Jorge reclamou que não conseguia ver o total do orçamento no tablet. Eu fui no arquivo appView.php e alterei o código assim: <style> @media (min-width: 768px) { body {width: 750px; margin: auto} } @media (max-width: 767px) { body {width: 600px} } <style> E o meu irmão mostrou que o tablet foi capaz de mostrar o total, eu reduzi o <body> do tablet de 750px para 600px. O nome dessa mágica é o Bootstrap, ele consegue mostrar o que projetei num código para 750px no notebook dentro de um tablet de 600px. Claro que não dá para esperar a mesma mágica no celular. Mas hoje eu lembrei que o celular tem dois modos, o retrato e a paisagem. O modo paisagem tem bem mais que 600px, mas o meu celular mostra exatamente o que eu vejo no modo retrato com as fontes bem ampliadas. Pedi ajuda para o Copilot, pedi para ele me ensinar como fazer o celular não ampliar a fonte, quando mudo o modo retrato para paisagem: <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
Encontrei nesse fórum um tema bem interessante, usar o PHP para distribuir tarefas entre pessoas. Eu comecei com João e Maria, e as tarefas eram limpar o chão e limpar o teto. O Copilot entendeu o meu problema, e ele resolveu o meu problema assim: João fica com o chão e a Maria fica com o teto. O código do Copilot é uma bela obra de arte, e ele mostra que o PHP é a melhor forma de começar um projeto. Baseado nesse trabalho, expliquei para o Copilot que o Leonardo e o Danilo não querem trabalhar na entrada e no auditório, e ele resolveu assim: <?php // Array de colaboradores $colaboradores = array('Leonardo', 'Danilo', 'Mateus', 'Lucas', 'Pedro', 'Batista'); // Array de tarefas $tarefas = array('entrada', 'auditorio', 'Fone 1', 'Fone 2', 'leitor', 'som'); // Atribuir tarefas aos colaboradores $atribuicoes = array(); $indicesNaoPermitidos = array(); // Definir um índice inicial $indiceInicial = 0; foreach ($tarefas as $tarefa) { // Verifica se a tarefa é "entrada" ou "auditorio" if ($tarefa == 'entrada' || $tarefa == 'auditorio') { // Encontra um colaborador que não seja Leonardo ou Danilo while (in_array($indiceInicial, $indicesNaoPermitidos) || $colaboradores[$indiceInicial] == 'Leonardo' || $colaboradores[$indiceInicial] == 'Danilo') { $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } } else { // Encontra o próximo colaborador disponível while (in_array($indiceInicial, $indicesNaoPermitidos)) { $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } } // Atribui a tarefa ao colaborador $atribuicoes[$colaboradores[$indiceInicial]] = $tarefa; // Armazena o índice usado para evitar duplicações $indicesNaoPermitidos[] = $indiceInicial; // Move para o próximo colaborador $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } // Exibir as atribuições foreach ($atribuicoes as $colaborador => $tarefa) { echo "$colaborador: $tarefa <br>"; } ?>
-
Usando o Copilot, cheguei nessa solução, mas para simplificar não considerei o dia em que a tarefa será executada, mas acredito que dá para expandir o código, até atingir o objetivo do seu projeto: <?php // Array de colaboradores $colaboradores = array('Leonardo', 'Danilo', 'Mateus', 'Lucas', 'Pedro', 'Batista'); // Array de tarefas $tarefas = array('entrada', 'auditorio', 'Fone 1', 'Fone 2', 'leitor', 'som'); // Atribuir tarefas aos colaboradores $atribuicoes = array(); $indicesNaoPermitidos = array(); // Definir um índice inicial $indiceInicial = 0; foreach ($tarefas as $tarefa) { // Verifica se a tarefa é "entrada" ou "auditorio" if ($tarefa == 'entrada' || $tarefa == 'auditorio') { // Encontra um colaborador que não seja Leonardo ou Danilo while (in_array($indiceInicial, $indicesNaoPermitidos) || $colaboradores[$indiceInicial] == 'Leonardo' || $colaboradores[$indiceInicial] == 'Danilo') { $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } } else { // Encontra o próximo colaborador disponível while (in_array($indiceInicial, $indicesNaoPermitidos)) { $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } } // Atribui a tarefa ao colaborador $atribuicoes[$colaboradores[$indiceInicial]] = $tarefa; // Armazena o índice usado para evitar duplicações $indicesNaoPermitidos[] = $indiceInicial; // Move para o próximo colaborador $indiceInicial = ($indiceInicial + 1) % count($colaboradores); } // Exibir as atribuições foreach ($atribuicoes as $colaborador => $tarefa) { echo "$colaborador: $tarefa <br>"; } ?>