![](https://forum.scriptbrasil.com.br/uploads/set_resources_1/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
Frank K Hosaka
Membros-
Total de itens
1.516 -
Registro em
-
Última visita
Frank K Hosaka's Achievements
0
Reputação
-
Tentei copiar o código Laravel para o formulário de login no PHP, e não deu certo. Imaginei que a diferença entre o Laravel e o PHP fosse a tecnologia Vite, então instalei o Tailwind no notebook, e também não deu certo. Então decidi usar o famoso método da tentativa e erro, e fazer com que o login do PHP fosse mais ou menos parecido com o do Laravel, usando o CDN do Tailwind (o JavaScript reclama que ele não deve ser usado no modo produção, mas é uma das poucas coisas que funciona), e eu consegui: arquivo loginView.php <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://cdn.tailwindcss.com"></script> <div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100"> <h1 class=text-xl>Projeto Chirper</h1> <main class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg"> <form method="post" action=loginMenu> <div> <label for="email" class=block>Email</label> <input class="w-full p-2 border border-gray-300 rounded-lg focus:outline-blue-700" id="email" type="email" name="email" required="required" autofocus="autofocus" autocomplete="username"> </div> <div class="mt-4"> <label for="password" class=block>Senha</label> <input class="w-full p-2 border border-gray-300 rounded-lg focus:outline-blue-700" id="password" type="password" name="password" required="required" autocomplete="current-password"> </div> <div class="flex items-center justify-end mt-4"> <button class="inline-flex items-center px-4 py-2 bg-gray-500 rounded-md font-semibold text-xs text-white uppercase"> Entrar </button> </div> </form> </main> </div>
-
A minha tela de login no projeto php é um horror na tela do celular, ele só aparece a metade do formulário no modo retrato. Tentei estudar o Laravel para ver como ele consegue colocar todo o formulário do login tanto no modo retrato como no modo paisagem no celular, mas eu não consegui apurar aonde começa o código e onde termina. Pedi ajuda para o Copilot, e ele me arranjou dois arquivos, o HTML e o CSS. Peguei o terminal do VS Code e digitei php -S 0.0.0.0:8000 e no celular eu digitei 192.168.0.4:8000, e comecei a estudar a tal da responsividade. O arquivo CSS é enorme, mas fiquei imaginando como ficaria o celular sem o CSS. O celular continuou funcionando, e diminui todo o HTML nos seguintes códigos: <form> <h2>Login</h2> <div> <input type="text" id="username" name="username" required placeholder="Usuário"> </div> <div> <input type="password" id="password" name="password" required placeholder="Senha"> </div> <input type="submit"> </form> Ou seja, o HTML é responsivo. O CSS é pura perfumaria.
-
Na imagem abaixo eu encontrei uma pequena diferença de R$ 0,01, ele é resultado da equação: C = aint(B - A). Para tentar resolver esse problema, eu improvisei assim: C = aint(B) - aint(A). Ele resolveu o meu problema agora. Não sei se dá para usar essa solução por toda a vida. a função aint que eu criei é essa: <?php function aint($valor) { return intval($valor*100)/100; }
-
Ao invés de conectar o Excel no MySQL remoto, eu pensei em jogar no PHP o serviço do Excel. Criei uma tabela chamada previsão, criei uma classe previsão e também uma imagem previsão. Se eu conseguir terminar o serviço, vou poder fazer as tarefas no celular, não vou mais depender do laptop: arquivo previsao.php <?php class previsao { static function alterar() { $previsao=deca($_POST['previsao']); $conta=$_POST['conta']; bd::x("update tbprevisao set valor=:valor where conta=:conta", ['valor'=>$previsao,'conta'=>$conta])->getx(); return self::inicio(); } static function inicio() { balancete::tbw(1); $painel=bd::x("select * from tbprevisao join tbw on tbprevisao.conta = tbw.conta")->get(); return view('previsaoView',['painel'=>$painel]); } } <?php require('menuView.php'); ?> <script>btMenu.innerHTML="Previsão";document.title="Previsão"</script> <div class="flex"> <div class="w-[50px] text-right">Conta</div> <div class="w-[200px] px-2">Descricao</div> <div class="w-[100px] text-right">Previsão</div> <div class="w-[100px] text-right">Contábil</div> <div class="w-[100px] text-right">Divergência</div> </div> <div class=flex> <?php foreach($painel as $p): ?> <div class="w-[50px] text-right"><?=$p->conta?></div> <div class="w-[200px] px-2 truncate"><?=$p->descricao?></div> <div class="w-[100px] text-right"> <form action=previsaoAlterar method=post> <input class="w-[100px] text-right" name=previsao value=<?=dec($p->valor)?>> <input type=hidden name=conta value=<?=$p->conta?>> </fom> </div> <div class="w-[100px] text-right"><?=dec($p->fim)?></div> <div class="w-[100px] text-right"><?=dec(abs($p->valor - $p->fim))?></div> <?php endforeach;?> </div>
-
O PHP foi a melhor maneira que eu encontrei para conectar o meu celular com o MySQL. Tanto o PHP como o MySQL estão hospedados na Hostinger. O problema é que o meu conhecimento em PHP é muito precário, ainda não posso jogar fora o programa Excel. Assim, todo ano preciso pagar R$ 459,00 para a Microsoft para eu poder usar o Excel (a assinatura se extende ao Access, ao Word, e muitos programas que não uso). Desde 2022, quando aluguei um espaço na Hostinger, preciso fazer um monte de backup do MySQL para eu poder conectar o Excel no banco de dados. Isso é uma chatice para quem detesta trabalhar, como é o meu caso. Assim, hoje eu pedi ajuda ao Copilot, ele me deixou feliz na hora que ele disse que posso conectar o Excel diretamente no MySQL lá na Hostinger. A minha alegria durou pouco tempo, eu não consegui conectar o meu ODBC à Hostinger. O problema não é só o Windows, é também a Hostinger, eu preciso mexer os pausinhos para o Excel poder consultar o banco de dados, conforme esse tutorial: https://www.hostinger.com/tutorials/mysql/how-to-grant-remote-access-mysql-vps Eu ainda não testei o tutorial, e assim continuo fazendo esse serviço chato do backup. Mas quem está na mesma situação que eu, desejo sorte com o tutorial.
-
Selecionar intervalo entre 2 textos no Word.
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Microsoft Office
[Copilot] Sub FormatTextInRed() Dim doc As Document Dim rng As Range Dim startPos As Long Dim endPos As Long ' Define the text delimiters Dim startText As String Dim endText As String startText = "aluno1" endText = "aluno2" ' Set the document Set doc = ActiveDocument ' Find the start position Set rng = doc.Content With rng.Find .Text = startText .Forward = True .Wrap = wdFindStop .Execute End With startPos = rng.Start + Len(startText) ' Find the end position Set rng = doc.Content With rng.Find .Text = endText .Forward = True .Wrap = wdFindStop .Execute End With endPos = rng.Start ' Format the text between the start and end positions Set rng = doc.Range(startPos, endPos) rng.Font.Color = wdColorRed End Sub -
O MS Access é bacana, eu apanhei durante 20 anos, e até hoje eu continuo apanhando. Pelo que vi, o problema é que existe uma tabela (tbSocio) com os campos (id,nome) e com os seguintes valores (1,Frank),(2,João),(3,Maria),(4,José),(5,Joaquim),(6,João). Também tem um formulário com o nome de frmSocio, e lá dentro tem um botão de navegação com o desenho do próximo registro (btProximo), e duas caixas de texto (txt_id) e (txt_nome). O problema é bem difícil de resolver: como colocar os registros do tbSocio no frmSocio. O primeiro registro deverá ser executado pelo formulário. Os demais registros devem ser executados pelo botão, assim: Option Compare Database Dim rs As DAO.Recordset Private Sub Form_Load() Set rs = CurrentDb.OpenRecordset("SELECT id, nome FROM tbsocios") If Not rs.EOF Then rs.MoveFirst txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value End If End Sub Private Sub btProximo_Click() If Not rs.EOF Then rs.MoveNext If Not rs.EOF Then txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value Else MsgBox "Você chegou ao último registro." rs.MovePrevious ' Volta ao último registro válido End If End If End Sub
-
Eu inventei a rotina da baixa de estoque em 1999, quando trabalhava com MS Access, e adaptei em 2020 no PHP, mas ele é lento demais. A rotina olha toda a tabela de produtos, estuda cada caso, para ver se é necessário fazer ajuste para calcular o estoque presumido. Eu queria simplificar, ao invés de olhar tudo, o melhor é olhar o que precisa. Ou seja, na tabela histórico do produto, eu tenho algo do tipo (666,'2025-02-01',1,10.00), (666,'2025-02-02',1,10.00),(666,'2025-02-03',1,10.00), como eu faço para pegar o último registro? Eu achei a solução lá em 1999, mas ele é péssimo para os padrões de 2025. O lado bom de viver em 2025 é que tem o Copilot, é um serviço de inteligência artificial que a Microsoft não cobra nada. Por enquanto. E hoje, o Copilot me apresentou o WITH, eu nem sabia que isso existia no MySQL: <?php $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $sql="WITH Produtos AS ( SELECT tbprod.codprod, prod, id, qt, custototal, ROW_NUMBER() OVER (PARTITION BY tbprod.codprod ORDER BY id DESC) AS rn FROM tbprod JOIN tbhistprod ON tbhistprod.codprod = tbprod.codprod WHERE loc <> 'a24' AND qt > 0 AND lcto <> 15092 and lcto <> 15093 AND dia BETWEEN '2025-02-01' AND '2025-02-28') SELECT codprod,prod,id, qt, custototal FROM Produtos WHERE rn = 1"; $produtos=$pdo->query($sql)->fetchAll(PDO::FETCH_OBJ); echo "<table><th>CodProd<th>Prod<th>Qtotal<th>vTotal<th>Uqt<th>Uvalor<th>AjusteQ<th>AjusteV"; foreach($produtos as $produto) { $previa=$pdo->query("select sum(qt) as qt, sum(custototal) as total from tbhistprod where codprod=$produto->codprod")->fetchAll(PDO::FETCH_OBJ)[0]; if($produto->qt!==$previa->qt) { $ajusteQ=$produto->qt - $previa->qt; $ajusteV=$produto->custototal - $previa->total; echo "<tr><td>$produto->codprod<td>$produto->prod <td>$previa->qt<td>$previa->total<td>$produto->qt<td>$produto->custototal <td>$ajusteQ<td>$ajusteV"; } } echo "</table>";
-
O grande problema do Excel com macro é que ele só funciona no PC. Busquei uma alternativa na planilho do Google, eu e o Copilot perdemos o dia todo tentando fazer a planilha consultar o arquivo tbprod.csv, mas no final eu pedi para o Copilot copiar todo o arquivo na página2 da planilha ativa, e usar a página1 do mesmo jeito que no Excel: Apps Script function copiarConteudoCSVParaPlanilha() { var idArquivoCSV = '1wwN8Z-SR0t0pFhrQOyx9YFYpgSiwaQo_'; // Substitua pelo ID do seu arquivo tbprod.csv try { var arquivo = DriveApp.getFileById(idArquivoCSV); var conteudo = arquivo.getBlob().getDataAsString(); var linhas = Utilities.parseCsv(conteudo); var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folha = planilha.getActiveSheet(); // Limpar qualquer conteúdo existente na planilha folha.clear(); // Copiar o conteúdo do CSV para a planilha folha.getRange(1, 1, linhas.length, linhas[0].length).setValues(linhas); SpreadsheetApp.getUi().alert('Conteúdo do arquivo CSV copiado para a planilha com sucesso!'); } catch (erro) { Logger.log('Erro: ' + erro); SpreadsheetApp.getUi().alert('Ocorreu um erro: ' + erro); } } function onEdit(e) { var folhaAtiva = e.source.getActiveSheet(); var celulaEditada = e.range; var valorCelula = celulaEditada.getValue(); if (folhaAtiva.getSheetName() == 'Página1') { var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folhaBusca = planilha.getSheetByName('Página2'); if (!folhaBusca) { SpreadsheetApp.getUi().alert('A planilha "Página2" não foi encontrada.'); return; } var intervaloBusca = folhaBusca.getRange('A:D').getValues(); for (var i = 0; i < intervaloBusca.length; i++) { if (intervaloBusca[i][0] == valorCelula) { var valorCorrespondente = intervaloBusca[i][3]; // Valor da coluna D // Colocar o valor da coluna D ao lado do valor digitado na Página1 celulaEditada.offset(0, 1).setValue(valorCorrespondente); // Opcional: Exibir um alerta com o valor digitado e o valor correspondente SpreadsheetApp.getUi().alert('O valor digitado é: ' + valorCelula + '. O valor correspondente é: ' + valorCorrespondente); return; } } // Se nenhum valor correspondente for encontrado SpreadsheetApp.getUi().alert('Nenhum valor correspondente encontrado para: ' + valorCelula); } }
-
Botão macro com link para segunda planilha.
pergunta respondeu ao joaoclaudiobrasil de Frank K Hosaka em VBA
Copilot: Sub botao_D1() Sheets("Plan5").Range("B4").Select Range("Plan5!B4").Value = Range("Plan5!B4").Value + 25 End Sub -
Dihis Mason começou a seguir Frank K Hosaka
-
O PHP é o único recurso que eu conheço que conecta o MySQL com o HTML, e o Excel é o único recurso que o meu irmão Jorge conhece. Eu ainda não tenho a menor ideia de como fazer o pedido de compra, então decidi usar o PHP para exportar a tabela tbprod, assim: listagem parcial do produto.php function exportar() { $filename = "tbprod.csv"; header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename="' . $filename . '"'); header('Pragma: no-cache'); header('Expires: 0'); $file = fopen('php://output', "w"); fputcsv($file, array('codprod', 'un', 'prod','custo','marg', 'codbar','loc','emb','cf','codforn','estoque','venda','cfop'), ',', '"', "\\"); $result = (new conn)->select("* from tbprod where loc <> 'a24' order by prod"); if ($result && count($result) > 0) { foreach($result as $row) { fputcsv($file, (array)$row, ',', '"', "\\"); } require('menuView.php'); echo "Dados exportados com sucesso para " . $filename; } else { echo "Nenhum registro encontrado na tabela tbprod."; } fclose($file); } Para o meu irmão usar o arquivo tbprod.csv, eu criei a planilha SoFuncionaNoPC.xlms, com o seguinte código VBA Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' Adicione o código que você deseja executar ao dar duplo clique na célula If Not Intersect(Target, Me.Range("A1:Z100")) Is Nothing Then Dim valorProcurado As String Dim csvFilePath As String Dim csvFile As Workbook Dim csvSheet As Worksheet Dim activeSheet As Worksheet Dim found As Range Dim linhaAtual As Long Dim colunaAtual As Long ' Define o valor a ser procurado valorProcurado = ActiveCell.Value linhaAtual = ActiveCell.Row colunaAtual = ActiveCell.Column ' Caminho relativo para o arquivo CSV (no mesmo diretório da planilha atual) csvFilePath = ThisWorkbook.Path & "\tbprod.csv" ' Abre o arquivo CSV de forma oculta Application.ScreenUpdating = False Set csvFile = Workbooks.Open(csvFilePath) Set csvSheet = csvFile.Sheets(1) csvFile.Windows(1).Visible = False Set activeSheet = ThisWorkbook.activeSheet ' Procura pelo valor na coluna A (primeira coluna) Set found = csvSheet.Columns(1).Find(What:=valorProcurado, LookIn:=xlValues, LookAt:=xlWhole) ' Se encontrar o valor, copia a linha correspondente para a planilha ativa If Not found Is Nothing Then activeSheet.Cells(linhaAtual, colunaAtual + 1).Value = found.Offset(0, 2).Value Else MsgBox "Valor " & valorProcurado & " não encontrado no arquivo CSV.", vbExclamation End If ' Fecha o arquivo CSV csvFile.Close SaveChanges:=False Cancel = True ' Cancela a edição padrão de célula ao dar duplo clique End If End Sub Esse código vai no painel do código da planilha ativa. Por enquanto o programa é bem inútil, mas eu gostei. O meu irmão vai em uma célula qualquer, digita um valor, e ao dar um duplo clique na célula, o VBA vai até o tbprod.csv e traz a descrição do produto, se ele encontrar e coloca do lado da célula ativa.
-
Localizar e selecionar intervalo entre 2 textos no Word
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Visual Basic
Eu não entendi bem o problema, mesmo assim, tentei alterar o código assim: Public Sub Teste() Dim startText As String Dim endText As String Dim startPos As Long Dim endPos As Long Dim doc As Document Dim rng As Range Dim searchPos As Long startText = "End.: " endText = "Bairro: " Set doc = ActiveDocument searchPos = 1 Do startPos = InStr(searchPos, doc.Content.Text, startText) If startPos = 0 Then Exit Do endPos = InStr(startPos + Len(startText), doc.Content.Text, endText) If endPos = 0 Then Exit Do Set rng = doc.Range(startPos + Len(startText) - 1, endPos - 1) 'Substituir quebras de parágrafo por espaço rng.Text = Replace(rng.Text, vbCr, " ") searchPos = endPos + Len(endText) Loop End Sub -
Como capturar HTML editado no Textarea usando JavaScript?
pergunta respondeu ao claugo de Frank K Hosaka em Java
arquivo index.php <script src="https://cdn.tailwindcss.com"></script> <div class="w-[1000px] mt-5 flex m-0 m-auto"> <textarea rows="10" cols="50" class="border border-1 border-black" oninput="replica.innerText=this.value"> </textarea> <div id=replica class="w-[500px] h-[300px] border border-black"> </div> </div> -
Depois de 30 anos, finalmente descobri um jeito de tirar o texto de um pdf. A dica foi do Deep Seek: basta abrir o PDF no Adobe Reader, selecionar o texto, copiar e colar num arquivo texto. Nunca pensei que fosse tão fácil. Com arquivo de texto dá fazer uma festa com o PHP: arquivo fera.txt 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 RUA A - BOX 27 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 RUA A - BOX 35 arquivo index.php <?php // Define o caminho para o arquivo de texto $caminhoArquivo = 'fera.txt'; // Abre o arquivo para leitura $arquivo = fopen($caminhoArquivo, 'r'); if ($arquivo) { // Lê o conteúdo do arquivo linha por linha while (($linha = fgets($arquivo)) !== false) { $pos=strpos($linha," RUA"); $separar=substr($linha,0, $pos); echo $separar . "<br>"; $partes = explode(" ", $separar); // Atribui cada parte a uma variável correspondente $codigo = array_shift($partes); echo "codigo $codigo <br>"; $qt1 = array_shift($partes); echo "qt1 $qt1 <br>"; $total = array_pop($partes); echo "total $total <br>"; $unitario = array_pop($partes); echo "unitario $unitario <br>"; $qt2 = array_pop($partes); echo "qt2 $qt2 <br>"; $descricao = implode(' ', $partes); echo "descricao $descricao <br><br>"; } // Fecha o arquivo fclose($arquivo); } ?> // resultado: 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 codigo 103898 qt1 2,00 total 17,64 unitario 8,82 qt2 1,00 descricao REPOLHO ROXO 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 codigo 103899 qt1 1,00 total 8,82 unitario 8,82 qt2 1,00 descricao REPOLHO FATIADO NO MEIO
-
Erro em tempo de execução 9 Subscrito fora do intervalo
pergunta respondeu ao Barabara Amorim de Frank K Hosaka em Tutoriais & Dicas - MS Office
Eu não consegui resolver o problema, mas gostei bastante do código, o problema é que o Excel travou e assim eu pedi ajuda para o Copilot, e a sugestão dele deu certo. Eu montei uma nova planilha com o nome de Geral, onde célula A1=Digite Aqui, B1=Data, C1=Hora, D1=Soma(a2:a20), e o código ficou assim: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False ' Desativa eventos temporariamente On Error GoTo ExitSub ' Tratamento de erros para garantir que eventos sejam reativados If Target.Row > 1 Then If Target.Column = 1 Then Cells(Target.Row, 2) = Date Cells(Target.Row, 3) = Time Cells(Target.Row, 4) = Sheets("Geral").Cells(1, 4).Value End If End If ExitSub: Application.EnableEvents = True ' Reativa eventos End Sub