Recuperar valores dos Campos do Banco de Dados FB no Delphi

07/06/2021

0

Boa tarde, estou tentando recuperar os valores dos campos do banco de dados FB para fazer um INSERT com os valores recuperados através de uma pesquisa por itens, mas eu fiz um teste para ver se estava puxando tudo certo com um ShowMessage(); e na mensagem aparece "0" como o códgio do produto e no banco de dados o produto é número "2" e os outros campos aparece em branco a mensagem da função, meu código é este:

procedure TFrmPrincipal.rct_inserirprodClick(Sender: TObject);
var
  inserirp,prodcodbarra: string;
  prodcodigo,numesa: integer;
  prodprecvend: double;

begin


  if edt_inserirprod.Text <> '''''''' then
  begin
    inserirp := edt_inserirprod.Text;

    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.Clear;
    DM_Comanda.FDQueryInsProd.SQL.Add(''''select * from PRODUTO where descricao like :cInserirp'''');
    DM_Comanda.FDQueryInsProd.ParamByName(''''cInserirp'''').AsString := inserirp;
    DM_Comanda.FDQueryInsProd.Open;

    prodcodigo := DM_Comanda.FDQueryInsProd.FieldByName(''''codigo'''').AsInteger;
    prodcodbarra :=  DM_Comanda.FDQueryInsProd.FieldByName(''''codbarra'''').AsString;
    prodprecvend := DM_Comanda.FDQueryInsProd.FieldByName(''''precovenda'''').AsFloat;

    numesa := lbl_numesa.Text.ToInteger;

    ShowMessage((prodcodigo).tostring); -------- Estou aqui tentando imprimir os valores dos campos do banco de dados da Query para ver se está tudo certo para eu poder
                                                                                   esta gravando com um INSERT, mas não está puxando os valores, o que posso estar fazendo de errado ? qual a melhor
                                                                                   maneira de fazer isso ?

    //DM_Comanda.FDQueryInsProd.Close;
    //DM_Comanda.FDQueryInsProd.SQL.Clear;
    //DM_Comanda.FDQueryInsProd.SQL.Add(''''insert into MESACARTAO (mesa,produto,codbarra,preco) values (numesa,prodcodigo,prodcodbarra,prodprecvend)'''');
    //DM_Comanda.FDQueryInsProd.Open;

  end;
Helton Faria

Helton Faria

Responder

Post mais votado

07/06/2021

procedure TFrmPrincipal.rct_inserirprodClick(Sender: TObject);
var
  inserirp, prodcodbarra: string;
  prodcodigo, numesa: integer;
  prodprecvend: double;
begin
  // edt_inserirprod.Text contém o curinga pra usar com like?
  inserirp := edt_inserirprod.Text;

  if inserirp > '' then
  begin
    // se edt_inserirprod.Text não contém o curinga, precisa inserir
    // caso não contenha o % (percentual) o like funciona como = (igual)
    // outra coisa: por padrão o Firebird é case sensitive.
    // nesse caso só vai encontrar o registro se o conteúdo pesquisado for idêntico ao conteúdo gravado.
    // para evitar problemas na busca sugiro sempre transforma tudo em maiúsculas no momento da pesquisa
    inserirp := AnsiUpperCase(inserirp) + '%';

    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.Text := 'select * from PRODUTO where upper(descricao) like '+QuotedStr(inserirp); // transforma descricao em maiúsculas e pesquisa por um conteúdo também em maiúsculas
    DM_Comanda.FDQueryInsProd.Open;

	if DM_Comanda.FDQueryInsProd.Eof then
	begin
      ShowMessage('Nenhum registro encontrado!');
      exit; // sai da procedure
	end;

    prodcodigo := DM_Comanda.FDQueryInsProd.FieldByName('codigo').AsInteger;
    prodcodbarra :=  DM_Comanda.FDQueryInsProd.FieldByName('codbarra').AsString;
    prodprecvend := DM_Comanda.FDQueryInsProd.FieldByName('precovenda').AsFloat;
 
    numesa := lbl_numesa.Text.ToInteger;
 
    ShowMessage(prodcodigo.tostring);
 
    //DM_Comanda.FDQueryInsProd.Close;
    //DM_Comanda.FDQueryInsProd.SQL.Clear;
    //DM_Comanda.FDQueryInsProd.SQL.Add(''''insert into MESACARTAO (mesa,produto,codbarra,preco) values (numesa,prodcodigo,prodcodbarra,prodprecvend)'''');
    //DM_Comanda.FDQueryInsProd.Open;
   end;

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

09/06/2021

Helton Faria

procedure TFrmPrincipal.rct_inserirprodClick(Sender: TObject);
var
  inserirp, prodcodbarra: string;
  prodcodigo, numesa: integer;
  prodprecvend: double;
begin
  // edt_inserirprod.Text contém o curinga pra usar com like?
  inserirp := edt_inserirprod.Text;

  if inserirp > '' then
  begin
    // se edt_inserirprod.Text não contém o curinga, precisa inserir
    // caso não contenha o % (percentual) o like funciona como = (igual)
    // outra coisa: por padrão o Firebird é case sensitive.
    // nesse caso só vai encontrar o registro se o conteúdo pesquisado for idêntico ao conteúdo gravado.
    // para evitar problemas na busca sugiro sempre transforma tudo em maiúsculas no momento da pesquisa
    inserirp := AnsiUpperCase(inserirp) + '%';

    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.Text := 'select * from PRODUTO where upper(descricao) like '+QuotedStr(inserirp); // transforma descricao em maiúsculas e pesquisa por um conteúdo também em maiúsculas
    DM_Comanda.FDQueryInsProd.Open;

	if DM_Comanda.FDQueryInsProd.Eof then
	begin
      ShowMessage('Nenhum registro encontrado!');
      exit; // sai da procedure
	end;

    prodcodigo := DM_Comanda.FDQueryInsProd.FieldByName('codigo').AsInteger;
    prodcodbarra :=  DM_Comanda.FDQueryInsProd.FieldByName('codbarra').AsString;
    prodprecvend := DM_Comanda.FDQueryInsProd.FieldByName('precovenda').AsFloat;
 
    numesa := lbl_numesa.Text.ToInteger;
 
    ShowMessage(prodcodigo.tostring);
 
    //DM_Comanda.FDQueryInsProd.Close;
    //DM_Comanda.FDQueryInsProd.SQL.Clear;
    //DM_Comanda.FDQueryInsProd.SQL.Add(''''insert into MESACARTAO (mesa,produto,codbarra,preco) values (numesa,prodcodigo,prodcodbarra,prodprecvend)'''');
    //DM_Comanda.FDQueryInsProd.Open;
   end;


Estou estudando Delphi tem muitas coisas que não sei ainda pois eu trabalhava mais com php e lá ele faz as conversões automáticamente, eu tenho outra dúvida se poder me ajudar só preciso desta direção, preciso inserir as informações no Firebird através deste Inset Into e no FB os tipos dos campos estão como a baixo, eu preciso fazer alguma conversão para inserir os dados na tabela ?
codigo do tipo NUMERIC é o campo de chave primária eu preciso fazer algum loop para ele fazer a contagem ?
mesa do tipo NUMERIC;
produto do tipo NUMERIC;
codbarra do tipo NUMERIC;
quantidade do tipo DOUBLE PRECISION;
preco do tipo DOUBLE PRECISION;
operador do tipo NUMERIC;
empresa do tipo NUMERIC;
data está no formato 27.05.2021 08:17 tipo TIMESTAMP;
totalitem do tipo DOUBLE PRECISION;
nomepro do tipo VARCHAR;
Responder

09/06/2021

Emerson Nascimento

sempre que puder, indique os campos que vai usar. assim você melhora a performance devido a redução do uso de memória e ao menor tráfego de informações pela rede.
    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.Text := 'select codigo, codbarra, precovenda from PRODUTO where upper(descricao) like '+QuotedStr(inserirp); // transforma descricao em maiúsculas e pesquisa por um conteúdo também em maiúsculas
    DM_Comanda.FDQueryInsProd.Open;


no caso do insert:
    prodcodigo := DM_Comanda.FDQueryInsProd.FieldByName('codigo').AsInteger;
    prodcodbarra :=  DM_Comanda.FDQueryInsProd.FieldByName('codbarra').AsString;
    prodprecvend := DM_Comanda.FDQueryInsProd.FieldByName('precovenda').AsFloat;
    numesa := lbl_numesa.Text.ToInteger;

    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.text := 'insert into MESACARTAO (mesa,produto,codbarra,preco) values (:numesa,:prodcodigo,:prodcodbar,:prodpreco)';
    DM_Comanda.FDQueryInsProd.ParamByName('numesa').AsInteger := numesa;
    DM_Comanda.FDQueryInsProd.ParamByName('prodcodigo').AsInteger := prodcodigo;
    DM_Comanda.FDQueryInsProd.ParamByName('prodcodbar').AsNumeric := prodcodbarra; // é numérico mesmo?
    DM_Comanda.FDQueryInsProd.ParamByName('prodpreco').AsFloat := prodprecvend;
    DM_Comanda.FDQueryInsProd.ExecSQL; // quando você tem um comando DDL ou DML você não abre (Open), você executa (ExecSQL)

    //Se a chave primária for autoincremental não precisa passar para o comando insert
Responder

09/06/2021

Helton Faria

sempre que puder, indique os campos que vai usar. assim você melhora a performance devido a redução do uso de memória e ao menor tráfego de informações pela rede.
    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.Text := 'select codigo, codbarra, precovenda from PRODUTO where upper(descricao) like '+QuotedStr(inserirp); // transforma descricao em maiúsculas e pesquisa por um conteúdo também em maiúsculas
    DM_Comanda.FDQueryInsProd.Open;


no caso do insert:
    prodcodigo := DM_Comanda.FDQueryInsProd.FieldByName('codigo').AsInteger;
    prodcodbarra :=  DM_Comanda.FDQueryInsProd.FieldByName('codbarra').AsString;
    prodprecvend := DM_Comanda.FDQueryInsProd.FieldByName('precovenda').AsFloat;
    numesa := lbl_numesa.Text.ToInteger;

    DM_Comanda.FDQueryInsProd.Close;
    DM_Comanda.FDQueryInsProd.SQL.text := 'insert into MESACARTAO (mesa,produto,codbarra,preco) values (:numesa,:prodcodigo,:prodcodbar,:prodpreco)';
    DM_Comanda.FDQueryInsProd.ParamByName('numesa').AsInteger := numesa;
    DM_Comanda.FDQueryInsProd.ParamByName('prodcodigo').AsInteger := prodcodigo;
    DM_Comanda.FDQueryInsProd.ParamByName('prodcodbar').AsNumeric := prodcodbarra; // é numérico mesmo?
    DM_Comanda.FDQueryInsProd.ParamByName('prodpreco').AsFloat := prodprecvend;
    DM_Comanda.FDQueryInsProd.ExecSQL; // quando você tem um comando DDL ou DML você não abre (Open), você executa (ExecSQL)

    //Se a chave primária for autoincremental não precisa passar para o comando insert


Obrigado por esclarecer minhas dúvidas, no IBEXPERT quando eu vou na aba FIELDS lá mostra que o tipo da coluna da tabela é do tipo NUMERIC, daria certo se eu colocasse a variável como Integer também ? ou tem que ser do tipo Numeric ? para fazer o INSERT INTO ? eu mexia com PhpMyAdmin e usava mais o INT mas o mercado de trabalho está exigindo;
Responder

09/06/2021

Emerson Nascimento

veja os tipos de dados do Delphi (http://docwiki.embarcadero.com/RADStudio/Sydney/en/Simple_Types_(Delphi)) e os tipos de campos (http://docwiki.embarcadero.com/Libraries/Sydney/en/Data.DB.TFieldType).
Daí veja qual comporta o conteúdo do campo.
Sempre vejo o campo do código de barras como string, porque 123456 é diferente de 0123456 e você não conseguirá guardar o conteúdo como 0123456 num campo numérico.






Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar