Jump to content
Fórum Script Brasil

Lazaruz

Membros
  • Content Count

    28
  • Joined

  • Last visited

Community Reputation

0 Neutro

About Lazaruz

  1. Obrigado Jhonas, realmente este procedimento irei precisar mais a frente, mas é bom saber que da para fazer por ele. Eu já ia mesmo apresentar o meu resultado baseado no DOC que postou , onde diz que em resumo entende-se que não só assignar Required só, não faz o efeito, tendo então eu adaptei um ex. que vi em algum outro lugar e ficou bem simples e construi em um função global que agente pode reuzar em qualquer DataSet: //Se for em um arquivo de funcoes simples: unit UnFUNCOES; {$mode objfpc}{$H+} interface USES Classes, sysutils,Dialogs,ZDataset,Forms,Db{TField}; //Declara: function ValidaEntradas(Dset:TDataSet): Boolean; //Varre todos os campos do DataSet e Checa quais tem Required function ValidaEntradas(Dset:TDataSet): Boolean; var i :Integer; Campos :TStrings; begin try Campos := TStringList.Create; //Cria cx de MSGs e guardo os campos //requeridos depois mostro a lista for i:=0 to Dset.Fields.Count-1 do begin if Dset.Fields[i].Required then begin if (Dset.Fields[i].AsString=EmptyStr) then Campos.Add(Dset.Fields[i].DisplayName); end; end; if (Campos.Text<>Emptystr) then begin //indice é a posicao na lista. Campos.Insert(0, ' Campos mantatórios:'); Campos.Insert(1, EmptyStr); ShowMessage(Campos.Text); result := false; end else result := true; finally Campos.Free; end; end; END. Usando dentro de um Datamodule: procedure TDataModule1.Query1BeforePost(DataSet: TDataSet); BEGIN if not ValidaEntradas(DataModule1.Query1) then Abort; //congela e mantem tela de edicao, mesmo se for no Grid END; Agora ficou universal e perfeito.
  2. Voce por acaso não quiz dizer OncolExit, se for isso eu já utilizo alguns assim, mas ColEnter não sei como.
  3. Não sei porque esses compiladores mais novos não faz mais como antes. Tem coisas que não da para entender. No D-5 era so mesmo eu assignar o required e vinha MSG padrão, dai era só traduzir o arquivo de mensagens. Bem.... vamos lá.. |Para testar campo mandatório tentei isto, mas não funcionou. procedure ZQueryTIPOValidate(Sender: TField); begin if ZQuery.FieldByName('TIPO').Required then begin if ZQuery.FieldByName('TIPO').IsNull then begin Raise exception.create('CAMPO OBRIGATORIO.'#10); end; end; end; Obs : Não estou utilizando nenhum componente TEdit, e somente edição em DBgrid.
  4. Olá! Ao utilizar Delphi eu assignava true na propriedade Required dos campos de Query e em modo runtime barrava situação de campo em branco automaticamente sem ter de escrever nada nos edits. É um recurso prático e simples. Isto não esta fazendo efeito no Lazaruz 1.6. com ZQuery. alguém saberia se tenho que setar mais algo?
  5. Showww!! Valeu denovo. Deve ter vindo de algum baú e ainda de algum subterrâneo. Já li tantos livros e nunca vi isto. Funcionou! Abr.
  6. Olá a todos, Eu utiliava Delphi 5 e criei funções que tinham comutação de tuplas, sinais de operação e outro como strings etc. dentro de uma string de SELECT que operava o pseudo SQL de Paradox. ex: If condição = ativo varSinal := '+' else:= '-' SELECT a ' + varSinal + 'b AS RESULTADO FROM TABELA. não reparem a sintaxe, mas é só ilustrativa. Agora utilizo nas Zquery em Lazarus/pascal e não consegui concatenar a variavel que atribui o sinal de operação aritimética. Alguém se habilita por gentileza a um Help? Obrigado.
  7. Valeu, Jhonas. Ta lá o nosso trabalho.  Só não sei ate hoje como coloca os codigos dentro daquele scrollbox no site.abracao.

    1. Jhonas

      Jhonas

      Se voce quiser colocar algum código no seu post, clique no simbolo que aparece no  ( Menu ) a direita do U ( sublinhado )

      ( < > ) quando voce estiver  editando o post.

      Abraço

  8. Com enorme agradecimento ao companheiro Jhonas, que me acompanhou me me ajudou a estruturar a ideia, segue o resultado final, que consegui que fosse bem enxuto e operacional com uma procedure de calculos simples, e como sugerido sem tratar nada em stored procedures de banco. Após a criação das tabelas conforme posts anteriores: procedure Tform.calculaMED(Sender: TObject); begin With Dtm do begin ZQryResultAux.Open; //Criei uma Query igual a TBresult para o laço interno VTabNota.Open ; // Trabalhar no laço externo para agregar as notas nos calulos. //ANALISE: O laco interno é baseado na tabela auxiliar com os mesmos campos da tabela Result. //Tabela RESULT é gravada dado os parametros do laco executado na tabela AUXILIAR. // O laco externo serve para fazer o update nos casos de somas ou calculos de registros agregados. WHILE NOT ZQryNota.EOF do //dece selecionando cada NOTA begin ZQryResultAux.First; with ZQryResultAux do begin; //Posta os valores direto na tab fisica de resultado utilizando sub selects WHILE not EOF do begin //SOMA COLUNA TOT_ITEM E POSTA EM COLUNA TOTCOLUNA ZQryResult.sql.clear; ZQryResult.sql.add('UPDATE tbresult SET totcoluna = (SELECT SUM(tot_item) FROM tbresult WHERE idNC = :Param_numID) WHERE idNC= :Param_numID ; '); ZQryResult.ParamByName('Param_numID').AsString=:ZQryNota.FieldByName('id').asstring; ZQryResult.ExecSQL ; //CALCULA, POSTA CUSTO DE CADA ITEM ZQryResult.sql.clear; ZQryResult.sql.add('UPDATE tbresult SET custo_item = '+ '(SELECT ((((tot_custos) / tot_opers_liq * 100) * '+ '(tot_item / 100))) '+ 'FROM tbresult WHERE id_result = :ParamIDresult) WHERE id_result = :ParamIDresult; '); ZQryResult.ParamByName('ParamIDresult').AsString := ZQryResultAux.FieldByName('id_result').asstring; ZQryResult.ExecSQL ; ZQryResultAux.Next ; end; //EOF tabela auxiliar end; //Qry auxiliar VZQryNota.Next; end;//EOF notas end;//Dtm end;//Proced CALCULO DE CUSTO PROPORCIONAL: Fica ai para quem precisar. Tem várias utilidades. Obrigado ao site. Suma importância para auxílio o desenvolvimento.
  9. Bem.... então eu mesmo respondo a questão: procedure TfLISTA.calcula(Sender: TObject); begin //CRIO A TABELA VIRTUAL TEMPORARIA QUE USO SO PARA ARMAZENAR A SOMA: Dtm.ZQryResult.sql.clear; Dtm.ZQryResult.sql.add('CREATE TEMP TABLE IF NOT EXISTS tbtempor(totcoluna FLOAT); '); Dtm.ZQryResult.ExecSQL; with Dtm.ZQryResult do //Faco tudo nesta nesta Query begin; close; -----------------------------------------------ELIMINO O BLOCO ABAIXO------------------------------------------------ Não é nescessário porque eu faço a soma aonde eu preciso (no caso na inclusao da tbtempor) e o campo alias não servira para pegar de outro select. //FACO A SOMA CRIANDO UM CAMPO ALIAS total // sql.clear; // sql.add('SELECT id,idNC, SUM(valorX) AS total FROM tbresult WHERE idNC = 27 ;'); // open; -------------------------------------FACO A SOMA AQUI MESMO COM valorX------------------------------------------- //ARMAZENO A SOMA NA TBTEMPORARIA: sql.clear; sql.add('INSERT OR REPLACE INTO tbtempor (totcoluna) VALUES ((SELECT SUM(valorX) FROM tbresult WHERE idNC = 27)); '); ----------------FAÇO UPDATE NA COLUNA TOTAL JÁ EXISTENTE NA TBRESULT -------------------- sql.clear; sql.add('UPDATE tbresult SET total = (SELECT totcoluna FROM tbtempor) WHERE idNC = 27;'); ExecSQL; ---------------------------------- OK AGORA É SÓ VISUALIZAR -------------------------------------------------------------- //SELECT DE VISUALIZACAO NO GRID sql.clear; sql.add('select * from tbresult; '); open; end;//QueryResult end;//Procedur //RESUMINDO: Um campo criado como ALIAS não serviria para calculo porque ele só processa no próprio select ativo. Para quem esta iniciando como eu fica ai a dica do erro.
  10. Será que estou fazendo certo? //Objetivo : fazer update de um resultado de uma soma anteriormente feita na mesma tabela. //tbresult é uma tabela normal criada em tempo de execução. //Tem 3 registros com ocorrencias de idNC = 27 na tabela tbresult //Criei uma tabela temporaria so para armazenamento de valor da soma porque SQLite não declara procedure. procedure TfLISTA.calcula(Sender: TObject); begin //CRIO A TABELA VIRTUAL TEMPORARIA QUE USO SO PARA ARMAZENAR A SOMA: Dtm.ZQryResult.sql.clear; Dtm.ZQryResult.sql.add('CREATE TEMP TABLE IF NOT EXISTS tbtempor(totcoluna FLOAT); '); Dtm.ZQryResult.ExecSQL; with Dtm.ZQryResult do //Faco tudo nesta nesta Query begin; close; //FACO A SOMA CRIANDO UM CAMPO ALIAS sql.clear; sql.add('SELECT id,idNC, SUM(valorX) AS total FROM tbresult WHERE idNC = 27 ;'); open; //Ok //ARMAZENO A SOMA NA TBTEMPORARIA: sql.clear; //VALUES(totcoluna) sql.add('INSERT OR REPLACE INTO tbtempor VALUES(SELECT total FROM tbresult WHERE idNC = 27); '); ExecSQL; //Ok com um valor fixo ex...values(1234) mas com a expressao do sub select acima não vem nada //TENTO FAZER UPDATE DO RESULTADO DA SOMA (que já deve esta na tbtempor) NA COLUNA TOTAL(já existente e não virtual e nem como alias) DA TBRESULT sql.clear; sql.add('UPDATE tbresult SET total = (SELECT totcoluna FROM tbtempor) WHERE idNC = 27;'); ExecSQL; //SELECT DE VISUALIZACAO NO GRID sql.clear; sql.add('select * from tbresult; '); open; end;//QueryResult end;//Procedur //RESUMINDO: Se eu colocar um valor VALUES(1234) O GRID TRAZ MAS SE EU COLOCAR: VALUES(SELECT total FROM tbresult WHERE idNC = 27) na TBTEMPOR, não VEM NADA.
  11. Correto, minha tbresult esta perfeita. O percebi é que ela é criada com campos como tipo TEXT e não VARCHAR(x), e ai que esta o estranho. Mas depois de testar de toda forma resolvi simplesmente seguir as orientações do site oficial SQLite, onde diz que não há como deletar colunas ou alterar nomes ou tipagem nas colunas, só aceitando ALTER TABLE tbresult ADD ...., portanto até que alguém apresente melhor devemos fazer tudo na mão grande mesmo: Obs.: Não utilizo componente clienteDataSet , uso Dsource e Zquery . 1- Criar tbresul_OLD baseada nos dados da tb operacao: procedure TformLISTA.calculaMED(Sender: TObject); Var i, reg, cc, counter : integer; begin with DTM do begin with ZQryResult do begin Active := false; sql.clear; sql.add('CREATE TABLE tbresult_OLD AS '+ 'SELECT . . . . . . . . . . . .'+ 'FROM tboperacao AS A '+ 'JOIN tbnota AS B ON (B.id = A.idNC) ;'); ExecSQL; { 2-Criar tbresult_NEW no modo normal de criacao declarando todos os campos com nome e tipagens originais:} sql.clear; sql.add('CREATE TABLE tbresult_NEW ('+ 'id INTEGER PRIMAY KEY, '+ 'idNC INTEGER, '+ 'data DATE, '+ { Val1,Val2,Va3 nÃo precisamos mais porque já tenho até aqui a soma deles TOT_CUSTO que servirá para o cálculo final.} 'num_nc VARCHAR(12), '+ 'nome_item VARCHAR(14), '+ 'tot_item FLOAT, '+ 'tot_custos FLOAT, '+ 'tot_coluna_item FLOAT, '+ 'custo_item FLOAT, '+ 'val_med_fin FLOAT); '); ExecSQL; { Seguindo com popular a tbresult_NEW. Deletar tbresult_OLD. Renomear tbresult_NEW para tbresult.} . . . . . . . .end // Query end; //Dtm (datamodule) end; //PROCEDURE Agora continuarei com os cálculos via PROCEDURE pascal como sugeriu e estruturou o laço para mim. Vou postando os resultados como ex para os demais interessados no post. Parece fácil , mas para mim não que estou saindo de outro tipo de bases de dados e estou engatinhando no SQL .
  12. Depois de alguns problemas para que o SQL sugerido rodasse redondo na ZQuery do Lazarus carregando a tb temporária, consegui obter apresentação no grid desta tbResult porém todos os valores nos campos que são inerentes a tabela original física tb operações aparecem assim: (MEMO) (MEMO) (MEMO) etc. ate o final dos regs. Depois de pesquisar bastante e não achar nada tentei mudar o campo para os modos na propriedade FielddKind , BlobType etc.. e nada. que será isto? Inclusive quando eu abro o próprio gerenciador com o mesmo SELECT aparece assim também. O único lugar que aparece os valores normais (que foram declarados originalmente como VARCHAR , FLOAT etc.. ) é na barra de STATUS inferior de apresentação do resultado do SQL. ESTRANHO ?!?! Obs. Ainda estou persistindo no SQLite, e estou quase chegando lá. Falta pouco , é só escrever a rotina de procedure de cálculos.
  13. Jhonas, valeu novamente. Eu consegui sim executar esta ultimo SQL, tranquilamente no SQLite. Tenho agora nele custo total de cada nota em cada registro e totais no mesmo registro. Só faltará soma total dos valores de coluna (qde*preco_un), que como voce sugeriu farei via procedure Pascal Lazarus/Delphi. Só esclarecendo: tenho que interfacear esta TBRESULT criando uma novo DataSet (Zquery) que apesar de tabela ser temporaria a ZQuery vai entender? Colocarer este último select na query que já utilizo e criar outra query para a TBRESULT ser tratada via PROCEDURE D.pascal. Obrigado.
  14. Ola, Jhonas, agradeço muito o modelo de procedure, realmente eu não conseguiria sozinho. No SQLite que não existe stored procedure, pelo que já procurei na web e site oficial. Ainda estou estudando o modelo da tua procedure para que eu possa concluir uma adaptação para somente estudos no MySql ,até uma forma de implementar.Como eu tinha dito só poderei utilizar SQLite no projeto. Por gentileza, favor deixar o post aberto para debates. abr.
  15. Achei , é que eu tinha colocado nome _do_item por infelicedade minha e voce simplificou. Não tem prob. . Agora me deu seguinte resposta: Executando Consulta. Aguarde... Estatísticas da Consulta 'solucaoTBresult' (Tempo: 00:00:00, Linhas: 5, Colunas: 13) Query Successfull. Returned 5 records. Estatísticas da Consulta 'solucaoTBresult' (Tempo: 00:00:00, Linhas: 0, Colunas: 0) Affected Rows: 0 Estatísticas da Consulta 'solucaoTBresult' (Tempo: 00:00:00, Linhas: 0, Colunas: 0) Affected Rows: 0 Estatísticas da Consulta 'solucaoTBresult' (Tempo: 00:00:00, Linhas: 0, Colunas: 0) Affected Rows: 0 Estatísticas da Consulta 'solucaoTBresult' (Tempo: 00:00:00, Linhas: 0, Colunas: 0) Affected Rows: 0 Mas não trouxe os dados como o seu. Vou persistir nisso aqui ainda enquanto isso.
×
×
  • Create New...