
Frank K Hosaka
Membros-
Total de itens
1.623 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Eu fiz o teste no MySQL Workbench assim: alter table tbfrequencia add column COLUNA1 integer, add column COLUNA2 integer, add column COLUNA3 integer e o resultado ficou assim: CREATE TABLE `tbfrequencia` ( `id` int NOT NULL AUTO_INCREMENT, `data_comparecimento` datetime DEFAULT NULL, `idAluno` int DEFAULT NULL, `COLUNA1` int DEFAULT NULL, `COLUNA2` int DEFAULT NULL, `COLUNA3` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci
-
Alunos com a último comparecimento >15 dias por mês
pergunta respondeu ao Guilherme Miranda de Frank K Hosaka em MySQL
Eu não consegui montar as tabelas, usando a sua consulta. Assim, eu montei uma tabela assim: CREATE TABLE `tbfrequencia` ( `id` int NOT NULL AUTO_INCREMENT, `data_comparecimento` datetime DEFAULT NULL, `idAluno` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci Nessa tabela tem centenas de alunos e milhares de frequências. O problema é encontrar a última frequência de cada aluno e calcular a diferença de dias entre a última frequencia e a data de hoje: SELECT idAluno, MAX(data_comparecimento), timestampdiff(day,max(data_comparecimento),now()) as ausencia FROM tbfrequencia GROUP BY idAluno ORDER BY ausencia desc; -
Não consegui converter o balancete.php em Laravel
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
O código Laravel está correto. O problema está no MySQL, eu tive que refazer a consulta. O balancete - MySQL - Fórum Script Brasil -
Para consertar as consultas, fiz o seguinte vw_bal1 separa apenas os registros da tbdiario que fazem parte da apuração vw_bal2 soma os débitos e créditos do vw_bal1 vw_bal3 calcula o saldo anterior à apuração vw_balanço ajunta vw_bal2 e vw_bal3 Acho que essa é a única solução em qualquer banco de dados, para cálculos complexos, o melhor é fazer em partes menores e ajuntar tudo lá no final. CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_bal1` AS SELECT `diario`.`tbdiario`.`dia` AS `dia`, `diario`.`tbdiario`.`docto` AS `docto`, `diario`.`tbdiario`.`conta` AS `conta`, `diario`.`tbdiario`.`debito` AS `debito`, `diario`.`tbdiario`.`credito` AS `credito`, `diario`.`tbdiario`.`hist` AS `hist` FROM (`diario`.`tbdiario` JOIN `diario`.`tbsupervariavel`) WHERE ((YEAR(`diario`.`tbdiario`.`dia`) = `diario`.`tbsupervariavel`.`anoapurado`) AND (MONTH(`diario`.`tbdiario`.`dia`) = `diario`.`tbsupervariavel`.`mesapurado`)) ORDER BY `diario`.`tbdiario`.`dia` , `diario`.`tbdiario`.`docto` CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_bal2` AS SELECT `diario`.`vw_bal1`.`conta` AS `conta`, SUM(`diario`.`vw_bal1`.`debito`) AS `debito`, SUM(`diario`.`vw_bal1`.`credito`) AS `credito` FROM `diario`.`vw_bal1` GROUP BY `diario`.`vw_bal1`.`conta` ORDER BY `diario`.`vw_bal1`.`conta` CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_bal3` AS SELECT `diario`.`tbdiario`.`conta` AS `conta`, `diario`.`tbconta`.`descricao` AS `descricao`, (SUM(COALESCE(`diario`.`tbdiario`.`debito`, 0)) - SUM(COALESCE(`diario`.`tbdiario`.`credito`, 0))) AS `saldo` FROM ((`diario`.`tbdiario` JOIN `diario`.`tbsupervariavel`) JOIN `diario`.`tbconta` ON ((`diario`.`tbdiario`.`conta` = `diario`.`tbconta`.`conta`))) WHERE (`diario`.`tbdiario`.`dia` < `diario`.`tbsupervariavel`.`primeirodia`) GROUP BY `diario`.`tbdiario`.`conta` ORDER BY `diario`.`tbdiario`.`conta` CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_balanco` AS SELECT `diario`.`vw_bal3`.`conta` AS `conta`, `diario`.`vw_bal3`.`descricao` AS `descricao`, `diario`.`vw_bal3`.`saldo` AS `saldo`, `diario`.`vw_bal2`.`debito` AS `debito`, `diario`.`vw_bal2`.`credito` AS `credito` FROM (`diario`.`vw_bal3` LEFT JOIN `diario`.`vw_bal2` ON ((`diario`.`vw_bal3`.`conta` = `diario`.`vw_bal2`.`conta`)))
-
Eu encontrei na internet alguns exemplos de como usar o Eloquent para trabalhar com a soma de dois campos, mas o que eu precisava mesmo era somar a soma dos dois campos. Eu consegui fazer isso no PHP, mas não consegui adaptar no Eloquent. Usando o método da tentativa e erro, a minha saída foi montar o balancete no MySQL, coisa que eu não consegui no tempo do PHP. Ontem eu escrevi nesse fórum "o balancete" no tópico do MySQL, e hoje pedi para o Laravel usar o Eloquent e botar o balancete na apresentação. A apresentação deu certo, o problema são os valores, muitos deles são bem estranhos. Ou seja, vou ter que rastrear os valores desde o MySQL até chegar no Eloquent. Mesmo assim, aqui está o meu rascunho do Controller e do balancete.blade.php, dessa vez tudo parcial, apenas os trechos "operacionais": trecho do balancete.blade.php <div class=divteste> <table class='table table-striped linha'><tr><th><th align=left> <a >{{$mesextenso}} de {{$ano}}</a> </th><th align=right>Anterior<th align=right>Débito <th align=right>Crédito<th align=right>Saldo Atual @foreach($contas as $conta) <tr><td>{{{$conta->conta}}}<td nowrap>{{{$conta->descricao}}} <td align=right>{{{dec($conta->saldo)}}} <td align=right>{{{dec($conta->debito)}}} <td align=right>{{{dec($conta->credito)}}} <td align=right>{{{dec($conta->saldo + $conta->debito - $conta->credito)}}} @endforeach trecho do diarioController public function balancete(){ $apuracoes=vw_apuracao::all()->toArray(); $tudo=tbsupervariavel::all(); $mesextenso=$tudo->value('mesextenso'); $ano=$tudo->value('anoapurado'); $contas=vw_balanco::all(); return view('balancete',['menu'=>'Balancete','mesextenso'=>$mesextenso,'ano'=>$ano],compact('apuracoes','contas'));}
-
Como você não passou a estrutura da tabela, eu tive que improvisar uma: CREATE TABLE `tbdizimo` ( `id` int NOT NULL, `data` date DEFAULT NULL, `oferta` float DEFAULT NULL, `ovelha` varchar(45) COLLATE utf8_swedish_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci Para saber qual foi a menor oferta e a maior oferta de cada ovelho nesses últimos três meses, eu criei a seguinte consulta: CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `astudy`.`vw_dizimo` AS SELECT `astudy`.`tbdizimo`.`ovelha` AS `ovelha`, MIN(`astudy`.`tbdizimo`.`oferta`) AS `Min`, MAX(`astudy`.`tbdizimo`.`oferta`) AS `Max` FROM `astudy`.`tbdizimo` WHERE (`astudy`.`tbdizimo`.`data` BETWEEN '2022-08-01' AND '2022-10-30') GROUP BY `astudy`.`tbdizimo`.`ovelha`
-
Eu estou criando um balancete no Laravel, mas eu percebi que o Controller iria ficar bem grande e difícil de manusear. Assim decidi montar o balancete no MySQL para o Laravel já pegar quase tudo mastigado. Aqui as principais tabelas e views que eu criei: CREATE TABLE `tbsupervariavel` ( `codsuper` int NOT NULL, `docto` int DEFAULT NULL, `dia` date DEFAULT NULL, `codprod` int DEFAULT NULL, `anoapurado` int DEFAULT NULL, `mesapurado` int DEFAULT NULL, `mesextenso` varchar(10) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `primeirodia` date DEFAULT NULL, `end` varchar(45) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `senha` varchar(20) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `ped` mediumint DEFAULT NULL, `codp` mediumint DEFAULT NULL, `pessoa` varchar(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `criterio` varchar(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT 'null', `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`codsuper`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci CREATE TABLE `tbdiario` ( `docto` mediumint NOT NULL AUTO_INCREMENT, `dia` date DEFAULT NULL, `conta` mediumint DEFAULT NULL, `debito` decimal(13,2) DEFAULT NULL, `credito` decimal(13,2) DEFAULT NULL, `hist` varchar(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, PRIMARY KEY (`docto`), KEY `Conta_idx` (`conta`), CONSTRAINT `Conta` FOREIGN KEY (`conta`) REFERENCES `tbconta` (`conta`) ) ENGINE=InnoDB AUTO_INCREMENT=14489 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci CREATE TABLE `tbconta` ( `conta` mediumint NOT NULL, `descricao` varchar(50) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `tipoconta` varchar(10) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL, `ordemconta` int DEFAULT NULL, PRIMARY KEY (`conta`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_movimento` AS SELECT `diario`.`tbdiario`.`conta` AS `conta`, SUM(`diario`.`tbdiario`.`debito`) AS `debito`, SUM(`diario`.`tbdiario`.`credito`) AS `credito` FROM ((`diario`.`tbconta` JOIN `diario`.`tbdiario`) JOIN `diario`.`tbsupervariavel`) WHERE ((YEAR(`diario`.`tbdiario`.`dia`) = `diario`.`tbsupervariavel`.`anoapurado`) AND (MONTH(`diario`.`tbdiario`.`dia`) = `diario`.`tbsupervariavel`.`mesapurado`)) GROUP BY `diario`.`tbdiario`.`conta` ORDER BY `diario`.`tbdiario`.`conta` CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_anterior` AS SELECT `diario`.`tbdiario`.`conta` AS `conta`, `diario`.`tbconta`.`descricao` AS `descricao`, (SUM(COALESCE(`diario`.`tbdiario`.`debito`, 0)) - SUM(COALESCE(`diario`.`tbdiario`.`credito`, 0))) AS `saldo` FROM ((`diario`.`tbdiario` JOIN `diario`.`tbsupervariavel`) JOIN `diario`.`tbconta` ON ((`diario`.`tbdiario`.`conta` = `diario`.`tbconta`.`conta`))) WHERE (`diario`.`tbdiario`.`dia` < `diario`.`tbsupervariavel`.`primeirodia`) GROUP BY `diario`.`tbdiario`.`conta` ORDER BY `diario`.`tbdiario`.`conta` CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `diario`.`vw_balanco` AS SELECT `diario`.`vw_anterior`.`conta` AS `conta`, `diario`.`vw_anterior`.`descricao` AS `descricao`, `diario`.`vw_anterior`.`saldo` AS `saldo`, `diario`.`vw_movimento`.`debito` AS `debito`, `diario`.`vw_movimento`.`credito` AS `credito` FROM (`diario`.`vw_anterior` LEFT JOIN `diario`.`vw_movimento` ON ((`diario`.`vw_anterior`.`conta` = `diario`.`vw_movimento`.`conta`)))
-
Valeu, consegui! <?php $mysqli=new mysqli("localhost","root","","astudy"); $loja=$mysqli->real_escape_string("Poppy's"); // <-------------- $query=$mysqli->query("update tbl_aposta set historico = '$loja' where num_sorte=3"); $query2=$mysqli->query("select * from tbl_aposta where num_sorte=3"); $row2=$query2->fetch_assoc(); var_dump($row2); // deu certo!
-
<?php /* CREATE TABLE `tbl_aposta` ( `num_sorte` int NOT NULL, `numeros_compra` int DEFAULT NULL, `historico` varchar(45) COLLATE utf8_swedish_ci DEFAULT NULL, PRIMARY KEY (`num_sorte`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_swedish_ci */ $mysqli=new mysqli("localhost","root","","astudy"); $loja="Poppy's"; $query=$mysqli->query("update tbl_aposta set historico = '$loja' where num_sorte=3"); $query2=$mysqli->query("select * from tbl_aposta where num_sorte=3"); $row2=$query2->fetch_assoc(); var_dump($row2); // resultado null // 2a. tentativa $mysqli->set_charset("utf8mb3"); $query=sprintf("update tbl_aposta set historico = '$loja' where num_sorte=3",$mysqli->real_escape_string($loja)); $query2=$mysqli->query("select * from tbl_aposta where num_sorte=3"); $row2=$query2->fetch_assoc(); var_dump($row2); // resultado null Não consegui. Tem jeito de consertar?
-
Hoje estava fazendo um registro contábil onde coloquei no histórico Poppy's, só que o lançamento não foi confirmado. Eu imaginei que esqueci de apertar o botão confirmar. Tentei de novo. E novamente o lançamento não foi confirmado. A minha opção foi tirar a aspa. Mas fiquei imaginando, por que posso escrever Poppy's no Facebook mas não posso escrever no meu banco de dados? O comando no MySQL seria assim update tbdiario set hist = "Poppy's" Aqui tem aspas demais. Eu não tenho como escrever: $sql="update tbdiario set hist = "Poppy's"; no PHP. Certamente o PHP iria reclamar da sintaxe, ele não saberia onde começa uma frase e onde termina a outra. Mas se eu não consigo resolver esse problema, como é que o Facebook consegue?
-
O fontawesome é um capítulo do CSS e não deveria ser comentado no tópico do PHP, mas, no meu caso, não tive outra escolha. O PHP é um conjunto de arquivos que fica debaixo do diretório C:/wamp64/www para quem usa o Windows, como é o meu caso. E dentro do diretório do PHP é que a gente coloca as pastas CSS e JS para dar suporte aos códigos do PHP. No tempo do Font Awesome 4.7.0, bastava usar o arquivo font-awesome.min.css no diretório CSS, com o seguinte código: <link rel="stylesheet" href="css/font-awesome.min.css"> <i class="fa fa-user"></i> <i class="fa fa-lock"></i> <i class="fa fa-rocket fa-4"></i> <span class="fa-stack fa-lg pull-left"><i class="fa fa-dashboard fa-stack-1x "></i></span> <span class="fa-stack fa-lg pull-left"><i class="fa fa fa-plus fa-stack-1x "></i></span> Mas eu pensei em atualizar o Awesome, e baixei o pacote 6.2.0. Tudo mudou. Ao invés de figuras, eu só encontrei retângulos. O nome do arquivo não é mais font-awesome.min.css e sim fontawesome.min.css, mas não adiantou nada atualizar o nome do arquivo. Eu li o manual do Awesome 6.2.0 e achei muito complicado, quando só preciso de algumas figuras. Assim, eu improvisei, usei o famoso método da tentativa e erro, mas precisei mudar o perfil do diretório do PHP. Eu tirei o arquivo fontawesome.min.css do subdiretório CSS do PHP e no lugar eu coloquei all.css (que vem no pacote do 6.2.0). Eu também copiei a pasta webfonts que veio no pacote, e agora a minha pasta PHP tem três subpastas, o CSS, o JS e o WEBFONTS. Claro que eu tentei colocar o webfonts dentro do css, mas o resultado foi um desastre. E também tive que mudar o código do link, assim <link rel="stylesheet" href="css/all.css"> O CSS é bacana, mas para usar, não é fácil não!
-
SQLSTATE[42000]: Syntax error - SELECT list is not in GROUP BY
uma questão postou Frank K Hosaka PHP
Eu tenho uma aplicação chamada balancete.php e decidi converter em Laravel. Copiei o mesmo arquivo no diretório views com o nome de balancete.blade.php, bem como criei uma rota e um método no controlador para dar vida ao código. Para não gerar erro, eu comentei o código assim <!--, ou seja, o Laravel não vai exibir nada. O método balancete que eu criei no controlador ficou assim: public function balancete(){ $apuracao=vw_apuracao::all(); return view('balancete',['menu'=>'Balancete'],compact('apuracao'));} Ao invés do Laravel mostrar uma tela em branco, ele devolveu uma enorme mensagem de erro, aqui eu vou resumir: SQLSTATE[42000]: Syntax error - SELECT list is not in GROUP BY incompatible with only_full_group_by option Para resolver o problema, usei o método da tentativa e erro. O vw_apuração é a soma de duas tabelas, a tbdiario e a tbconta. Criei um model para cada tabela, supondo que o model vw_apuração não seria suficiente para o Laravel trabalhar. Mas isso não resolveu o problema. Deixei o método da tentativa e erro de lado, e usei "only_full_group_by option Laravel" no motor de busca do Google, e ele me ofereceu essa opção: if you want to disable this in Laravel you have to change the 'strict' value to false in your database configuration in config/database.php. 'connections' => [ ... 'mysql' => [ ... 'strict' => false, ... ], ] A sugestão do Google deu certo! O melhor jeito de aprender a usar o Laravel é a tentativa e erro, mas fazer o Laravel funcionar o método Google é bem melhor. -
Eu usei o tutorial Laravel 9 Create Custom Helper Function in Tutorial (onlinewebtutorblog.com) e consegui criar a minha primeira função personalizada. No diretório app, criei o arquivo helpers.php assim: <?php function dec($num){return number_format($num,2,',','.');} A seguir, eu alterei o parâmetro autoload do composer.json assim: "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" },"files":["app/helpers.php"] }, Finalmente fui no painel do terminal do Visual Studio Code, e digitei o comando composer dump-load Usei a função dec num controlador, e deu tudo certo. Só a primeira função personalizada é que precisa seguir esse ritual. As outras funções podem ser acrescentadas diretamente no arquivo helpers.php. Eu fiz o teste, acrescentei uma nova função no helpers.php e ele ficou assim: <?php function dec($num){return number_format($num,2,',','.');} function deca($num){if($num==intval($num)){return $num;} else {return dec($num);}} Note que a segunda função chama a primeira função. A função dec formata preço e valores monetários no padrão brasileiro (sem o cifrão). Já a função deca formata a quantidade, se for inteiro não muda nada, se tiver ponto flutuante ele trabalha com duas casas decimais, mas usando a vírgula como ponto flutuante.
-
php - Gerar números aleatórios, salvar ao banco de dados sem repetição
pergunta respondeu ao rfreitas84 de Frank K Hosaka em PHP
<?php $loteria=[null,null,null,null,null]; $final=[1,1,1,1,1]; While($loteria<>$final){ $sorteio=rand(0,4); if(!$loteria[$sorteio]){ echo "Número sorteado $sorteio <br>"; $loteria[$sorteio]=1; } } Estudei o seu algoritmo, e acho que o problema está nessa linha: $quer = "SELECT num_sorte FROM tbl_aposta"; o correto deveria ser: $quer="select * from tbl_aposta"; Não sei como o seu algoritmo funciona, mas ele funciona! Para eu testar o seu algoritmo, eu fiz essas modificações: <?php /* mysql CREATE TABLE `tbl_aposta` ( `num_sorte` int NOT NULL, `numeros_compra` int DEFAULT NULL, PRIMARY KEY (`num_sorte`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin Testando: num_sorte=3; numeros_compra=1 */ function lottery($maxn = "49", $maxb = "6"){ $conexao=new mysqli('localhost','root','','astudy'); $maxn = 60; $new_array = array(); $quer="select * from tbl_aposta"; $query = mysqli_query($conexao, $quer); while ($query_get = mysqli_fetch_array($query)) { $new_array[] = $query_get["numeros_compra"]; srand((float) microtime() * 1000000); while (1 > 0) { do { //Aqui gera os números mas não fil $lottery[] = rand(0, $maxn); $lottery = array_unique($lottery); $new_array = array_unique($new_array);} while (in_array($lottery, $new_array)); if (sizeof($lottery) == $maxb) break;} sort($lottery); return implode(", ", $lottery);} } $lotterynums = lottery(); echo $lotterynums; exit; -
Finalmente, depois de muitas tentativas e erros, consegui de terminar a tradução do orcamento.php em Laravel. Aprendi muita coisa, mas principalmente o que significa controlador. Eu imaginei que o controlador fosse uma só coisa, e assim eu decidi colocar a rotina da exclusão de um item do orçamento logo no começo do controlador, mas isso gerou um erro, ele disse que não conhecia a variável total do pedido. Ou seja, o controlador chama o visualizador, mas quando o visualizador volta para o controlador, ele não encontra o mesmo controlador que começou o processo. A seguir a listagem final do meu orçamento (só do controlador e do visualizador, o resto continua igual como acima) resources.views.orcamento.blade.php ----------------------------------------------------- @include('menu') <div><table class='table table-striped'> <td><form><input type='submit' value='anterior'><input type='hidden' name='anterior' value={{$ped}}></form> <td style=color:red>Pedido {{$ped}} de {{$diaped}} <td><form><input type='submit' value='novo'><input type='hidden' name='novo' value='novo'></form></table> <form> <div><table class='table table-striped linha2'><th>Produto<th style=text-align:right>Qt<th>Un<th>Preço<th>Total @foreach($histped as $item) <tr> <td nowrap>{{$item->prod}} <td align=right> @if($item->qt==intval($item->qt)) {{$item->qt}} @else {{number_format($item->qt,2,',','.')}} @endif <td><a href=?excluir={{$item->id}}&abater={{$item->subtotal}}>{{$item->un}}</a> <td align=right>{{number_format($item->unitario,2,',','.')}} <td align=right>{{number_format($item->subtotal,2,',','.')}} @endforeach <tr> @if(!isset($_GET['produto'])) <td><input list=lsproduto name=produto placeholder=produto onchange=qt.focus() size=40> <datalist id='lsproduto'> @foreach($prod as $pr) <option value='{{$pr->prod}}'> @endforeach </datalist> @else <td>{{$orcamento['produto']}} @endif @if(!isset($_GET['qt'])) <td><input id=qt name=qt onchange=submit() size=1 placeholder=qt> @endif <tr><td> @if(empty($codp)) <a href=pessoa>Selecione um cliente</a> @else <details> <summary>{{$pessoa}}</summary> Endereço {{$end}} <br> CNPJ {{$cnpj}} <br> Telefone {{$tel}} <br> Nota {{$nota}} <br> <a href=pessoa>Mudar cliente</a> <br> <a href=pessoa?codp={{$codp}}>Atualizar cliente</a> </details> @endif <td><td><td><td><b>{{$totalped}} </table> </div> app.Http.Controllers.diarioController.php ------------------------------------------------------- <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\tbsupervariavel; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\vw_histped; use App\Models\tbprod; use App\Models\tbhistped; Use helper; class diarioController extends Controller { public function index(request $request) { $senhadb=tbsupervariavel::where('codsuper',1)->value('senha'); $senha=$request->input('senha'); $menu="Menu"; if($senha==1045){$request->session()->put('senha','parcial');return view('menu',['menu'=>$menu]);} if($senha==$senhadb){$request->session()->put('senha','completa'); return view('menu',['menu'=>$menu]);} if(empty($senha)){$mensagem="";} else {$mensagem="Senha incorreta";} return view('index',['mensagem'=>$mensagem]); } public function orcamento(request $request){ $ped=tbsupervariavel::where('codsuper',1)->value('ped'); if($request->input('anterior')){ $ped=$request->input('anterior'); $ped--;if($ped==0){$ped=1;} tbsupervariavel::where('codsuper',1)->update(['ped'=>$ped]);} if($request->input('novo')){ $ultimo=tbpedido::select()->orderBy('ped','desc')->first()->toArray(); if($ultimo['total']){ $ped=$ultimo['total']+1; dd($ped); tbpedido::insert(['ped'=>$ped,'dia'=>now()]); tbsupervariavel::where('codsuper',1)->update(['ped'=>$ped]);} else {$ped=$ultimo['ped'];} } $collectionA=collect(['menu'=>'Orçamento','ped'=>$ped]); tbsupervariavel::where('codsuper',1)->update(['end'=>'orcamento']); $detalhe=tbpedido::where('ped',$ped)->get()->toArray(); $codp=$detalhe[0]['codp']; $diaped=date('d/m/Y',strtotime($detalhe[0]['dia'])); $totalped=$detalhe[0]['total'];$vwtotalped=number_format($totalped,2,',','.'); $collectionB=collect(['codp'=>$codp,'diaped'=>$diaped,'totalped'=>$vwtotalped]); if($request->input('excluir')){ $id=$request->input('excluir'); $abater=$request->input('abater'); tbhistped::find($id)->delete(); $totalped-=$abater; tbpedido::where('ped',$ped)->update(['total'=>$totalped]); return redirect('orcamento');return "id $id abater $abater"; } $pessoa=tbpessoa::where('codp',$codp)->get()->toArray(); $histped=vw_histped::where('ped',$ped)->get(); if($codp){$pessoa1=$pessoa[0];}else{$pessoa1=["falta"=>"definir"];} $collectionC=collect($pessoa1); $prod=tbprod::orderBy('prod')->get(); $merged=$collectionA->merge($collectionB)->merge($collectionC); $merged=$merged->all(); $produto=$request->input('produto'); $qt=$request->input('qt'); if($qt){ $qt=str_replace(',','.',$qt); $qt=round($qt,2); $precoa=tbprod::where('prod',$produto)->get()->toArray(); if(!$precoa){ return "<h2>O produto <i>$produto</i> não existe, por favor selecione o produto corretamente</h1> <p> <input type=button value=entendi onclick=location.replace('orcamento')>";} $preço=$precoa[0]['custo']; $un=$precoa[0]['un']; $codprod=$precoa[0]['codprod']; $total=round($preço*$qt,2); tbhistped::insert(['ped'=>$ped,'codprod'=>$codprod,'un'=>$un,'unitario'=>$preço,'subtotal'=>$total,'qt'=>$qt]); $totalped+=$total; tbpedido::where('ped',$ped)->update(['total'=>$totalped, 'dia'=>now()]); return redirect('orcamento'); } else { $preço=null; $total=null; $un=null; } $orcamento=['produto'=>$produto,'qt'=>$qt,'un'=>$un,'preço'=>$preço,'total'=>$total]; return view('orcamento',$merged,compact('histped','prod','orcamento'));} }
-
Eu sou do tempo do Fortran, onde usávamos variáveis mnemônicas do tipo i e j, e assim dei o nome de tbprod para a tabela de produtos, mas o artigo está certo. Quanto melhor o nome que você dá aos bois mais fácil é identificar o boi que está tumultuando a entrada e saída do curral. "O problema é que idéias novas são fáceis de entender, o problema é esquecer as velhas" (John Maynard Keynes).
-
Lá em 1990 eu comecei o projeto Diário no MS Access, em 2020 traduzi na linguagem PHP e agora em 2022 pretendo traduzir na linguagem Laravel. Faz dois meses que eu tento fazer os códigos funcionarem, tudo na base da tentativa e erro, eu não consigo acompanhar os tutoriais do YouTube; para mim, o PHP já é suficiente, mas o Laravel é importante para eu aprender o que é servidor e cliente pois ele trabalha com o tripé roteador, controlador e visualizador. Eu gostei bastante do esquema Eloquent, apesar do Eloquent presumir que o nome das minhas tabelas está no plural, e isso me força a informar que não está. Ao contrário do mysqli do PHP, o Eloquent força a alterar o meu banco de dados. Numa das tabelas ele me obrigou a criar o campo created_at, sob pena do Laravel não fazer o que eu quero. O mais bacana é que eu abri um projeto do Laravel dentro da pasta do OneDrive, eu não preciso me preocupar com a cópia de segurança. Tudo o que eu fizer no projeto, o OneDrive vai dar um jeito de sincronizar no servdor da Microsoft. Finalmente, o orçamento é um desafio para todo programador, além do clássico "Hello World". A seguir eu fiz um pequeno rascunho de como pretendo implantar o orçamento no Laravel, tem muita coisa que eu já fiz, mas eu vou publicar apenas os trechos que acho mais relevante: routes>web.php ---------------------------------- <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\PacientesController; use App\Http\Controllers\diarioController; Route::get('astudy',[diarioController::class,'astudy']); app>Http>Controllers>diarioController.php ---------------------------------------------- <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\tbsupervariavel; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\vw_histped; use App\Models\tbprod; class diarioController extends Controller { public function astudy(request $request){ $prods=tbprod::orderBy('prod')->get(); $produto=$request->input('produto'); $qt=$request->input('qt'); if($qt){ $precoa=tbprod::where('prod',$produto)->get()->toArray(); $preço=$precoa[0]['custo']; $total=$preço*$qt; } else { $preço=null; $total=null; } return view('astudy',['produto'=>$produto,'qt'=>$qt,'preço'=>$preço,'total'=>$total],compact('prods'));} resources>views>astudy.blade.php ----------------------------------------------- <form> <table> <th>Produto<th>Qt<th>Preço<th>Total <tr> @if(isset($_GET['produto'])) <td>{{$produto}} @else <td><input name=produto list=produto> <datalist id=produto> @foreach($prods as $prod) <option value='{{$prod->prod}}'> @endforeach </datalist> @endif @if(isset($_GET['qt'])) <td>{{$qt}} @else <td><input name=qt onchange=submit()> @endif <td>{{$preço}}<td>{{$total}} </table> </form> app>Models>tbprod.php ------------------------------------------------------ <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbprod extends Model { use HasFactory; protected $table='tbprod'; } .env ------------------------------------------------------- DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=diario DB_USERNAME=root DB_PASSWORD=
-
O meu primeiro acesso ao banco de dados pelo Eloquent
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Hoje acrescentei a tbpessoa no controller do orçamento, mas ao invés de acrescentar o resultado da consulta em Collections do Laravel, eu mandei o resultado junto com Collections na linha do return. E deu certo! app.Http.Controllers.diarioController (listagem parcial) -------------------------------------------------------------------------------------- public function orcamento(){ $ped=tbsupervariavel::where('codsuper',1)->value('ped'); $collectionA=collect(['menu'=>'Menu','ped'=>$ped]); tbsupervariavel::where('codsuper',1)->update(['end'=>'orcamento']); $detalhe=tbpedido::where('ped',$ped)->get()->toArray(); $codp=$detalhe[0]['codp']; $diaped=$detalhe[0]['dia']; $total=$detalhe[0]['total']; $collectionB=collect(['codp'=>$codp,'diaped'=>$diaped,'total'=>$total]); $pessoa=tbpessoa::where('codp',$codp)->get()->toArray(); $pessoa1=$pessoa[0]; $merged=$collectionA->merge($collectionB); $merged=$merged->all(); return view('orcamento',$merged,$pessoa1); } O comando que eu mais uso no Laravel é o "dd($variavel);" para verificar se eu consegui montar um array que seja legível para o view. -
O meu primeiro acesso ao banco de dados pelo Eloquent
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Eu já criei um model para a tbpedido, outro para a tbpessoa, e agora estou começando a traduzir o meu código orçamento.php apenas como um método do diarioController. O que me assustou foi a quantidade de informações que eu preciso passar do Controller para o View, ficou uma listagem enorme, difícil de apurar. Mais difícil é procurar um tutorial que explique como passar um monte de informações do Controller para o View, e depois de dois dias de pesquisa aprendi a usar o Collections do Laravel. O método orçamento ainda está no começo, mas pela lista dá para ver como eu usei o recurso do Collections: primeiro.app.Http.Controllers.diarioController.php ------------------------------------------------------------------------ <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\tbsupervariavel; use App\Models\tbpedido; use App\Models\tbpessoa; class diarioController extends Controller { public function index(request $request) { $senhadb=tbsupervariavel::where('codsuper',1)->value('senha'); $senha=$request->input('senha'); $menu="Menu"; if($senha==1045){$request->session()->put('senha','parcial');return view('menu',['menu'=>$menu]);} if($senha==$senhadb){$request->session()->put('senha','completa'); return view('menu',['menu'=>$menu]);} if(empty($senha)){$mensagem="";} else {$mensagem="Senha incorreta";} return view('index',['mensagem'=>$mensagem]); } public function orcamento(){ $ped=tbsupervariavel::where('codsuper',1)->value('ped'); $collectionA=collect(['menu'=>'Menu','ped'=>$ped]); tbsupervariavel::where('codsuper',1)->update(['end'=>'orcamento']); $detalhe=tbpedido::where('ped',$ped)->get()->toArray(); $codp=$detalhe[0]['codp']; $diaped=$detalhe[0]['dia']; $total=$detalhe[0]['total']; $collectionB=collect(['codp'=>$codp,'diaped'=>$diaped,'total'=>$total]); $merged=$collectionA->merge($collectionB); $merged=$merged->all(); return view('orcamento',$merged); } } -
Eu tenho uma gigantesca dúvida na documentação do Laravel e mais ainda com os tutoriais espalhados na internet, assim só me restou o método da tentativa e erro para tentar colocar uma tabela do MySQL dentro do Laravel. O nome da tabela é tbsupervariavel, para colocá-lo dentro do Laravel usei o comando "php artisan make:model tbsupervarivel" no terminal do VS Code. O artisan criou o seguinte arquivo: <!-- primeiro.app.Models.tbsupervariavel.php --> <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbsupervariavel extends Model{ use HasFactory; protected $table= 'tbsupervariavel';} A última linha fui eu que coloquei, senão o Laravel iria considerar a tabela no plural "tbsupervariavels". O Laravel tem razão, o nome da minha tabela está errada, deveria ser plural e não singular. O grande problema é que eu não consegui encontrar um tutorial de como usar a tabela na controlador. Eu usei assim: <!-- primeiro.app.Http.Controllers.diarioController.php --> namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\tbsupervariavel; class diarioController extends Controller { public function index(request $request) { $senhadb=tbsupervariavel::where('codsuper',1)->value('senha'); $senha=$request->input('senha'); $menu="Menu"; if($senha==1045){$request->session()->put('senha','parcial');return view('menu',['menu'=>$menu]);} if($senha==$senhadb){$request->session()->put('senha','completa'); return view('menu',['menu'=>$menu]);} if(empty($senha)){$mensagem="";} else {$mensagem="Senha incorreta";} } return view('index',['mensagem'=>$mensagem]); } Para o controller acessar o banco de dados do Eloquent, eu precisei acrescentar "use App\Models\tbsupervariavel;". Eu ainda não estou familiarizado com a gramática do Laravel, mas estou muito contente por ter conseguido fazer a consulta na tabela. Foram cinco dias de tentativa e erro, e muito tutorial chato de assistir e entender.
-
Calcular o salário líquido a partir do bruto
pergunta respondeu ao FernandoG de Frank K Hosaka em PHP
Eu não consegui resolver o problema da anotação decimal do PHP e a brasileira. Aqui segue a minha contribuição (atenção a tabela do IR de 2022 é a mesma de 2015): <style> tr {height:50px} </style> <div style=width:500;height:550;background:lightblue;display:inline-block> <div style=text-align:center>Salário 2022 = Bruto - INSS - IR - Pensão<br>Use o ponto como separador decimal</div> <form method=get> <table style=margin:30px> <tr><td>Salário Bruto<td><td><input style=text-align:right name=bruto id=inpbruto> <tr><td>INSS<td><td align=right><label id=lbinss></label> <tr><td>IR<td><td align=right><label id=lbir></label> <tr><td>Redução base do IR: <tr><td>Dependentes<td><input id=inpdepende name=depende size=1> x 189.59 <tr><td>Pensão<td><td><input style=text-align:right id=inppensao name=pensao> <tr><td>Líquido<td><td align=right><label id=lbliquido></label> <tr><td><td><td align=right><input type=submit value=Calcular> </form></table><p> <div style=text-align:center> <form action=astudy.php><input type=submit value="Novo Cálculo"></form></div> </div> <div style=position:fixed;width:500px;height:260px;background:lightgray;top:8;display:inline-block> <img src="https://www.pontotel.com.br/wp-content/uploads/2021/08/tabela-inss-2022.webp" width=500 height=260"> </div> <div style=position:fixed;width:500px;height:260px;background:lightgray;top:268;display:inline-block> <img src="https://www.dinamicasistemas.com.br/upload/images/TABELA%20PROGRESSIVA.jpg" width=500 height=260> </div> <?php if(isset($_GET['bruto'])){ $bruto=$_GET['bruto']; $depende=$_GET['depende']; $pensao=$_GET['pensao']; if(empty($depende)){$descdepende=0;echo "<script>inpdepende.value=0</script>";} else { $descdepende=$depende*189.89;echo "<script>inpdepende.value=$depende</script>";} if(empty($pensao)){$pensao=0;echo "<script>inppensao.value='0'</script>";} else { echo "<script>inppensao.value='$pensao'</script>"; } echo "<script>inpbruto.value='$bruto'</script>"; $inss=0; // https://www.contabilizei.com.br/contabilidade-online/teto-inss/?utm_device=c&utm_term=&utm_source=google&utm_medium=cpc&utm_campaign=%5BMAX%5D_Performance_RMKT_SP&hsa_cam=14465064182&hsa_grp=&hsa_mt=&hsa_src=x&hsa_ad=&hsa_acc=1466761651&hsa_net=adwords&hsa_kw=&hsa_tgt=&hsa_ver=3&gclid=Cj0KCQjwj7CZBhDHARIsAPPWv3fDESQXO-54vamf5rr8EfwPos1rKQ5lA3-Huf5mSJp2y751DwFcdpsaAkihEALw_wcB if($bruto<=1212){$inss=$bruto*7.5/100;} if($bruto>1212 and $bruto<=2427.35){$inss=1212*7.5/100+($bruto-1212)*9/100;} if($bruto>2427.35 and $bruto<=3641.03){$inss=1212*7.5/100+(2427.35-1212)*9/100+($bruto-2427.35)*12/100;} if($bruto>3641.03 and $bruto<=7087.22){$inss=(1212*7.5/100+(2427.35-1212)*9/100+(3641.03-2427.35)*12/100+$bruto-3641.03)*14/100;} if($bruto>7087.22){$inss=828.38;} $inss=round($inss,2); echo "<script>lbinss.innerHTML='$inss'</script>"; $baseIR=$bruto-$inss-$descdepende-$pensao; // https://www.pontotel.com.br/calcular-irrf/ if($baseIR<=1903.98){$ir=0;} if($baseIR>1903.98 and $baseIR<=2826.65){$ir=$baseIR*7.5/100-142.80;} if($baseIR>2826.65 and $baseIR<=3751.05){$ir=$baseIR*15/100-354.80;} if($baseIR>3751.05 and $baseIR<=4664.68){$ir=$baseIR*22.5/100-636.13;} if($baseIR>4664.68){$ir=$baseIR*27.5/100-869.36;} $ir=round($ir,2); $liquido=$bruto-$inss-$ir; echo "<script>lbir.innerHTML='$ir';lbliquido.innerHTML='$liquido'</script>";} ?> -
Eu não sei o que fiz de errado, mas não estou conseguindo consertar o código. <?php $calculo=1.09; $fracao=$calculo-intval($calculo); if($fracao<0.09){echo "$fracao é menor que 0.09";} else {echo "$fracao não é menor que 0.09";} echo "<br>"; $custo=1; $margem=9; $calculo=intval($custo*(1+$margem/100)*100)/100; $fracao=$calculo-intval($calculo); if($fracao<0.09){echo "$fracao é menor que 0.09";} else {echo "$fracao não é menor que 0.09";} echo "<br>"; $custo=5.46; $margem=30; $calculo=intval($custo*(1+$margem/100)*100)/100; $fracao=$calculo-intval($calculo); if($fracao<0.09){echo "$fracao é menor que 0.09";} else {echo "$fracao não é menor que 0.09";}
-
-
Bloqueio global de página para 1 administrador
pergunta respondeu ao igormarques de Frank K Hosaka em PHP
Eu resolvi esse problema no meu projeto Diário assim: Se o usuário for comum, o menu será assim: aplicação 1, 2 e 3. Se o usuário for fedeal o menu será assim: aplicação 1, 2, 3 e 4, onde a aplicação 4 terá o privilégio de alterar variáveis usadas nas aplicações 1, 2 e 3. -
Eu criei um novo view chamado orcamento.blade.php. Para o link do orcamento funcionar dentro do view menu, criei a seguinte rota routes.web.php ---------------------------------------------------------- <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\PacientesController; use App\Http\Controllers\diarioController; Route::get('/',[diarioController::class,'index']); Route::post('/',[diarioController::class,'index']); Route::get('orcamento',function(){return view('orcamento');}); e também o orcamento.blade.php resources.views.orcamento.blade.php --------------------------------------------------------------------- @include('menu') <h1>Tela do Orçamento</h1> Ou seja, essa é forma que eu encontrei para incuir a tabela do menu em todas as rotinas. A sintaxe é quase a mesma do PHP, o problema é encontrar um tutorial que mostre essa solução. Eu levei cinco horas!