[firebase-br] Ajuda com SQL (Insert Into)

Diego Maccari diegomaccari em ig.com.br
Qui Fev 3 08:26:40 -03 2011


Então galera deixa eu tentar explicar melhor o que pretendo fazer...

O que eu tenho aqui é a necessidade de ler o conteúdo de um arquivo SPED 
FISCAL e gravar cada registro dos blocos do sped em uma determinada tabela 
por isso o no das tabelas no banco
a tabela TB_C100 refere-se ao registro C100 do bloco C que com tem 
informações da nota fiscal,e a TB_C170 refere-se ao registro C170 do bloco C 
que são os itens da nota fiscal
por isso acrecentei o ID das tabelas PAI nas tabelas filhas para que eu 
pudesse criar um vinculo para posteriormente ter como identificar todas as 
informações de cada Nota Fiscal
porem o arquivo SPED FISCAL trás para cada linha o nome do registro entre 
PIPES "|" por exemplo: |C100| ou |C170| assim todos os demais, então existe 
sempre a mesma seqüencia da registro no arquivo, por isso pensei em ler o 
arquivo gravar o registro C100 e ao gravar o C170 ou qualquer outro registro 
filho colocar o ID de C100, mas ai que surgiu o problema

Qual a melhor maneira de inserir o ID da tabela PAI na tabela FILHA ??

Usando GEN_ID ??
Usando MAX(ID)
Usando SP ??

Isso precisa ser em SQL mesmo para ser executado um script direto no banco 
só vou usar delphi para executar este script, então a ideia seria uma 
pequena aplicação le e cria este script e depois dele pronto carrego e 
executo o SQL.

estou com estes dois exemplos aqui

INSERT INTO TB_C170 (ID, CNPJ_IMP, MES_IMP, ANO_IMP, REG, NUM_ITEM, 
COD_ITEM, DESCR_COMPL, QTD, UNID, VL_ITEM, VL_DESC, IND_MOV, CST_ICMS, CFOP, 
COD_NAT, VL_BC_ICMS, ALIQ_ICMS, VL_ICMS, VL_BC_ICMS_ST, ALIQ_ST, VL_ICMS_ST, 
IND_APUR, CST_IPI, COD_ENQ, VL_BC_IPI, ALIQ_IPI, VL_IPI, CST_PIS, VL_BC_PIS, 
ALIQ_PIS, QUANT_BC_PIS, ALIQ_PIS_REAIS, VL_PIS, CST_COFINS, VL_BC_COFINS, 
ALIQ_COFINS, QUANT_BC_COFINS, ALIQ_COFINS_REAIS, VL_COFINS, COD_CTA, 
ID_C100) VALUES ((SELECT GEN_ID(GEN_TB_C170_ID, 1) FROM RDB$DATABASE), 
'00.000.000/0000-00', 'Janeiro', '2010', 'C170', 1, '42196', NULL, '16', 
'UN', '606.4', '0', '0', '060', '1403', '1403', '0', '0', '0', '0', '0', 
'0', '0', NULL, NULL, '0', '0', '0', '04', '0', '1.65', NULL, NULL, '0', 
'04', '0', '7.6', NULL, NULL, '0', '604', (SELECT GEN_ID(GEN_TB_C100_ID, 0) 
FROM RDB$DATABASE));

Ou

INSERT INTO TB_C170 (ID, CNPJ_IMP, MES_IMP, ANO_IMP, REG, NUM_ITEM, 
COD_ITEM, DESCR_COMPL, QTD, UNID, VL_ITEM, VL_DESC, IND_MOV, CST_ICMS, CFOP, 
COD_NAT, VL_BC_ICMS, ALIQ_ICMS, VL_ICMS, VL_BC_ICMS_ST, ALIQ_ST, VL_ICMS_ST, 
IND_APUR, CST_IPI, COD_ENQ, VL_BC_IPI, ALIQ_IPI, VL_IPI, CST_PIS, VL_BC_PIS, 
ALIQ_PIS, QUANT_BC_PIS, ALIQ_PIS_REAIS, VL_PIS, CST_COFINS, VL_BC_COFINS, 
ALIQ_COFINS, QUANT_BC_COFINS, ALIQ_COFINS_REAIS, VL_COFINS, COD_CTA, 
ID_C100) VALUES ((SELECT GEN_ID(GEN_TB_C170_ID, 1) FROM RDB$DATABASE), 
'00.000.000/0000-00', 'Janeiro', '2010', 'C170', 1, '42196', NULL, '16', 
'UN', '606.4', '0', '0', '060', '1403', '1403', '0', '0', '0', '0', '0', 
'0', '0', NULL, NULL, '0', '0', '0', '04', '0', '1.65', NULL, NULL, '0', 
'04', '0', '7.6', NULL, NULL, '0', '604', (SELECT MAX(ID)FROM TB_C100));













--------------------------------------------------
From: "andre conrado" <acf.andre em gmail.com>
Sent: Wednesday, February 02, 2011 5:59 PM
To: "FireBase" <lista em firebase.com.br>
Subject: Re: [firebase-br] RES: RES: Ajuda com SQL (Insert Into)

> Concordo contigo Antonio também, mas como sitei, o uso da função
> GEN_ID para obter o último ID da tabela não é segura tb. O mais
> correto mesmo seria utilizar uma SP que:
>
> 1 - gera o ID e guardar em uma variável local;
> 2 - Insira o registro na tabela TB_C100 utilizando para o ID o número
> guardado na variável local;
> 3 - e por último insira o registro na tabela TB_C170, utilizando a
> mesma variável local;
>
> mas não sabemos se o cenário de nosso amigo permiti essa simultaneidade;
>
> Em 02/02/11, Antonio Carlos<a.lima.silva em terra.com.br> escreveu:
>> Vou dar uma do contra aqui, quando vc faz select max em um contesto 
>> normal
>> de transação, se esse select for feito por duas estações 
>> "simultaneamente"
>> para as duas retornarão o mesmo valor e vai haver violação da chave.
>>
>> Att.
>> Antonio Carlos
>>
>>
>>
>> Confidencialidade: A informação contida nesta mensagem de e-mail, 
>> incluindo
>> quaisquer anexos, é confidencial e está reservada apenas à pessoa ou
>> entidade para a qual foi endereçada. Se você não é o destinatário ou a
>> pessoa responsável por encaminhar esta mensagem ao destinatário, você 
>> está,
>> por meio desta, notificado que não deverá rever, retransmitir, imprimir,
>> copiar, usar ou distribuir esta mensagem de e-mail ou quaisquer anexos. 
>> Caso
>> você tenha recebido esta mensagem por engano, por favor, contate o 
>> remetente
>> imediatamente e apague esta mensagem de seu computador ou de qualquer 
>> outro
>> banco de dados. Muito obrigado.
>>
>> -----Mensagem original-----
>> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] 
>> Em
>> nome de Diego Maccari
>> Enviada em: quarta-feira, 2 de fevereiro de 2011 14:50
>> Para: FireBase
>> Assunto: Re: [firebase-br] RES: Ajuda com SQL (Insert Into)
>>
>> Prezado André
>>
>> Primeiramente obrigado por sua disposição
>>
>> Substitui a função GEN_ID pela função MAX() sendo assim
>> onde eu teria:
>>
>> INSERT INTO TB_C170 (ID, CNPJ_IMP, MES_IMP, ANO_IMP, REG, NUM_ITEM,
>> COD_ITEM, DESCR_COMPL, QTD, UNID, VL_ITEM, VL_DESC, IND_MOV, CST_ICMS, 
>> CFOP,
>>
>> COD_NAT, VL_BC_ICMS, ALIQ_ICMS, VL_ICMS, VL_BC_ICMS_ST, ALIQ_ST, 
>> VL_ICMS_ST,
>>
>> IND_APUR, CST_IPI, COD_ENQ, VL_BC_IPI, ALIQ_IPI, VL_IPI, CST_PIS, 
>> VL_BC_PIS,
>>
>> ALIQ_PIS, QUANT_BC_PIS, ALIQ_PIS_REAIS, VL_PIS, CST_COFINS, VL_BC_COFINS,
>> ALIQ_COFINS, QUANT_BC_COFINS, ALIQ_COFINS_REAIS, VL_COFINS, COD_CTA,
>> ID_C100) VALUES ((SELECT GEN_ID(GEN_TB_C170_ID, 1) FROM RDB$DATABASE),
>> '00.000.000/0000-00', 'Janeiro', '2010', 'C170', 1, '42196', NULL, '16',
>> 'UN', '606.4', '0', '0', '060', '1403', '1403', '0', '0', '0', '0', '0',
>> '0', '0', NULL, NULL, '0', '0', '0', '04', '0', '1.65', NULL, NULL, '0',
>> '04', '0', '7.6', NULL, NULL, '0', '604', (SELECT GEN_ID(GEN_TB_C100_ID, 
>> 0)
>> FROM RDB$DATABASE));
>>
>> Passaria a ser:
>>
>> INSERT INTO TB_C170 (ID, CNPJ_IMP, MES_IMP, ANO_IMP, REG, NUM_ITEM,
>> COD_ITEM, DESCR_COMPL, QTD, UNID, VL_ITEM, VL_DESC, IND_MOV, CST_ICMS, 
>> CFOP,
>>
>> COD_NAT, VL_BC_ICMS, ALIQ_ICMS, VL_ICMS, VL_BC_ICMS_ST, ALIQ_ST, 
>> VL_ICMS_ST,
>>
>> IND_APUR, CST_IPI, COD_ENQ, VL_BC_IPI, ALIQ_IPI, VL_IPI, CST_PIS, 
>> VL_BC_PIS,
>>
>> ALIQ_PIS, QUANT_BC_PIS, ALIQ_PIS_REAIS, VL_PIS, CST_COFINS, VL_BC_COFINS,
>> ALIQ_COFINS, QUANT_BC_COFINS, ALIQ_COFINS_REAIS, VL_COFINS, COD_CTA,
>> ID_C100) VALUES ((SELECT GEN_ID(GEN_TB_C170_ID, 1) FROM RDB$DATABASE),
>> '00.000.000/0000-00', 'Janeiro', '2010', 'C170', 1, '42196', NULL, '16',
>> 'UN', '606.4', '0', '0', '060', '1403', '1403', '0', '0', '0', '0', '0',
>> '0', '0', NULL, NULL, '0', '0', '0', '04', '0', '1.65', NULL, NULL, '0',
>> '04', '0', '7.6', NULL, NULL, '0', '604', (SELECT MAX(ID)FROM TB_C100));
>>
>> Gostei do resultado ate porque com MAX() o maior ID da tabela e com 
>> GEN_ID
>> poderia ter problemas caso por algum motivo o
>> INSERT da TB_C700 não fosse executado corretamente,
>> muito obrigado pela dica, fico te devendo uma, valeu...
>>
>>
>> --------------------------------------------------
>> From: "andre conrado" <acf.andre em gmail.com>
>> Sent: Wednesday, February 02, 2011 2:07 PM
>> To: "FireBase" <lista em firebase.com.br>
>> Subject: Re: [firebase-br] RES: Ajuda com SQL (Insert Into)
>>
>>> Diego, ainda qto ao ID, vc não precisa usar o SELECT GEN_ID no INSERT,
>>> pode usar o GEN_ID sozinho como se faz com uma outra função qualquer.
>>>
>>> Agora, eu acredito q seria mais seguro se vc buscasse na tabela
>>> TB_C100 o último usando um SELECT MAX(ID) FROM TB_C100. Isso evitaria
>>> q numa possível manutenção futura (onde a forma de atualização do
>>> campo ID mudasse) a inserção ficasse inconsistente.
>>>
>>> Em 28/01/11, Carlos Alberto<cacgodinho em gmail.com> escreveu:
>>>> Diego,
>>>>
>>>> Tive problemas com inserção de datas no FB mas consegui resolver.
>>>> Faça da seguinte forma que funciona redondo...
>>>>
>>>> sqlstr="INSERT INTO TABELA (Codigo, Data) VALUES ('" & varCodigo & '", 
>>>> '"
>>
>>>> &
>>>> format(varData,"dd.mm.yyyy") & "')
>>>>
>>>> Espero que ajude...
>>>>
>>>> Carlos Alberto.
>>>>
>>>> ----- Original Message -----
>>>> From: "Diego Maccari" <diegomaccari em ig.com.br>
>>>> To: "FireBase" <lista em firebase.com.br>
>>>> Sent: Friday, January 28, 2011 9:13 AM
>>>> Subject: Re: [firebase-br] RES: Ajuda com SQL (Insert Into)
>>>>
>>>>
>>>> Julio muito obrigado pela dica mas este erro eu já consertei aqui o
>>>> problema
>>>> estava na falta de uma coluna não era o SELECT GEN_ID
>>>> o firebird aceita varios select's dentro do insert.
>>>>
>>>> mas pra minha felididade agora estou com problema em um campo DATE que
>>>> não
>>>> aceita um determinado valor exemplo = '10/01/2011'
>>>> como seria a maneira correta de inserir datas no fb  ?
>>>>
>>>> --------------------------------------------------
>>>> From: "Julio Cezar - Desenvolvimento" <juliocezarsilva em sfox.com.br>
>>>> Sent: Friday, January 28, 2011 8:17 AM
>>>> To: "'FireBase'" <lista em firebase.com.br>
>>>> Subject: [firebase-br] RES:  Ajuda com SQL (Insert Into)
>>>>
>>>>> Não sei se ajuda mas se ao inserir na tabela TB_C100_ID vc usar da
>>>>> seguinte
>>>>> forma.
>>>>>
>>>>> INSERT INT TB_C100_ID (SEUS CAMPOS) VALUES (OS VALORES) RETURNING O ID
>>>>> DA
>>>>> TABELA
>>>>>
>>>>> Você têm o id que inseriu nessa tabela disponivel em seu recordset
>>>>> depois
>>>>> basta fazer o insert na outra tabela, desta forma não funcionaria não?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Nada substitui o ser humano! Inst. Faber Ludens
>>>>> -----Mensagem original-----
>>>>> De: lista-bounces em firebase.com.br 
>>>>> [mailto:lista-bounces em firebase.com.br]
>>>>> Em
>>>>> nome de Jeter Rabelo Ferreira
>>>>> Enviada em: quinta-feira, 27 de janeiro de 2011 17:52
>>>>> Para: FireBase
>>>>> Assunto: Re: [firebase-br] Ajuda com SQL (Insert Into)
>>>>>
>>>>> GEN_ID(GEN_TB_C100_ID, 1)
>>>>>
>>>>> 2011/1/27 Diego Maccari dos Santos <diegomaccari em ig.com.br>
>>>>>
>>>>>> Ajuda com SQL (Insert Into)
>>>>>>
>>>>>> Pessol estou tentando inserir um registro no BD (Firebird) onde o 1º
>>>>>> campo
>>>>>> ID é chave primaria que recebe o valor de um generator e o ultimo 
>>>>>> campo
>>
>>>>>> é
>>>>>> um
>>>>>> campo INTEIRO no qual estou inserindo o valor da chve primaria de 
>>>>>> outra
>>>>>> tabela porem este campo não é chave estrangeira estou tentando pegar 
>>>>>> o
>>>>>> valor
>>>>>> do generator e inserir no campo não está dando certo uso o seguinte
>>>>>> SQL:
>>>>>>
>>>>>> INSERT INTO TB_C170 (ID, CNPJ_IMP, MES_IMP, ANO_IMP, REG, NUM_ITEM,
>>>>>> COD_ITEM, DESCR_COMPL, QTD, UNID, VL_ITEM, VL_DESC, IND_MOV, 
>>>>>> CST_ICMS,
>>>>>> CFOP,
>>>>>> COD_NAT, VL_BC_ICMS, ALIQ_ICMS, VL_ICMS, VL_BC_ICMS_ST, ALIQ_ST,
>>>>>> VL_ICMS_ST,
>>>>>> IND_APUR, CST_IPI, COD_ENQ, VL_BC_IPI, ALIQ_IPI, VL_IPI, CST_PIS,
>>>>>> VL_BC_PIS,
>>>>>> ALIQ_PIS, QUANT_BC_PIS, ALIQ_PIS_REAIS, VL_PIS, CST_COFINS,
>>>>>> VL_BC_COFINS,
>>>>>> ALIQ_COFINS, QUANT_BC_COFINS, ALIQ_COFINS_REAIS, VL_COFINS, COD_CTA,
>>>>>> ID_C100) VALUES ((SELECT GEN_ID(GEN_TB_C170_ID, 1) FROM 
>>>>>> RDB$DATABASE),
>>>>>> '00.000.000/0000-00', 'Janeiro', '2010', 'C170', , '73695', NULL, 
>>>>>> '49',
>>>>>> 'UN', '269,5', '0', '0', '010', '1403', '1403', '0', '7', '0', '0',
>>>>>> '0',
>>>>>> '0', '0', NULL, NULL, '0', '0', '0', '01', '269,5', '1,65', NULL, 
>>>>>> NULL,
>>>>>> '4,45', '01', '269,5', '7,6', NULL, NULL, '20,48', '604', (SELECT
>>>>>> GEN_ID(GEN_TB_C100_ID, 0) FROM RDB$DATABASE));
>>>>>>
>>>>>> Onde está o erro ???
>>>>>> Alguém pode ajudar?
>>>>>>
>>>>>> Acho que o erro está no ultimo SELECT GEN_ID que coloquei pra pegar o
>>>>>> ID
>>>>>> atual da outra tabela, a tabela chama TB_C100 e o Generation
>>>>>> GEN_TB_C100_ID.
>>>>>> ______________________________________________
>>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> []'s
>>>>> Jéter Rabelo Ferreira
>>>>> ______________________________________________
>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>>
>>>>>
>>>>> ______________________________________________
>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>
>>>>
>>>> ______________________________________________
>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>
>>>>
>>>> ______________________________________________
>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>
>>>
>>>
>>> --
>>> Um Abraço,
>>> André Conrado.
>>>
>>> 055 21 9176-7013 - Claro
>>> 055 21 9896-5449 - Vivo (apenas mensagens SMS)
>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>
> -- 
> Um Abraço,
> André Conrado.
>
> 055 21 9176-7013 - Claro
> 055 21 9896-5449 - Vivo (apenas mensagens SMS)
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: 
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista