So lança um linha do DB grid

Delphi

08/03/2013

Estou copiando os dados de um DB pra outro, conforme codigo abaixo:


DMTransfere.ADOQuery3.Close;
DMTransfere.ADOQuery3.SQL.Clear;
DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque where referencia =:pref');
DMTransfere.ADOQuery3.Parameters.ParamByName('pref').AsString := DMTransfere.ADOQuery1.FieldByName('referencia').AsString;
DMTransfere.ADOQuery3.Open;

Porem no select da Query 1 vem mais registro e so consigo copiar 1 dos registros
Tiago Santos

Tiago Santos

Curtidas 0

Respostas

Marcio

Marcio

08/03/2013

pode ser que tenha vários registros com o mesmo código de referência
desse jeito copia um registro só...

seria melhor fazer um loop....

GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

são referencias diferente, digamos 0001, 0002, 0003, 0004 e por ai vai. Ai preciso que venha todos os registros, so vem 1 quando seleciono e clico no botão. Preciso que ele venha atendendo aquela validação da query e traga quantas referecias tiver
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/03/2013

Na verdade, nesse código você está pegando apenas o registro selecionado na ADOQuery1, ou seja, sempre vai retornar sempre um registro. Você precisaria percorrer a query1 e montar um string pra usar em um operador IN na consulta.
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

e como ficaria a solução pra esse problema?
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

fiz assim:
DMTransfere.ADOQuery3.Close;
DMTransfere.ADOQuery3.SQL.Clear;
DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque where referencia =:pref');
DMTransfere.ADOQuery3.Open;
while not DMTransfere.ADOQuery3.Eof Do
begin
DMTransfere.ADOQuery3.Parameters.ParamByName('pref').value := DMTransfere.ADOQuery1.FieldByName('referencia').AsString;
DMTransfere.ADOQuery3.Next;
end;

mas nao tras nenhum registro
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

fiz assim:
DMTransfere.ADOQuery3.Close;
DMTransfere.ADOQuery3.SQL.Clear;
DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque where referencia =:pref');
DMTransfere.ADOQuery3.Open;
while not DMTransfere.ADOQuery3.Eof Do
begin
DMTransfere.ADOQuery3.Parameters.ParamByName('pref').value := DMTransfere.ADOQuery1.FieldByName('referencia').AsString;
DMTransfere.ADOQuery3.Next;
end;

mas nao tras nenhum registro


O colega poderia postar a estrutura dessas duas tabelas?

Da forma que está não vai retornar o que você espera, reveja a lógica, você tenta fazer a consulta informando uma condição REFERÊNCIA, porém vc não está alimentando o parametro.

O que o seu código está fazendo?
- Fazendo a consulta e tentando condicioná-la, porém o parametro está vazio, ele não está sendo alimentado corretamente.
- Você abre a ADOQuery3, depois faz um While not ... do para varre o dataset e alimentar o parametro, está errado.

Já tem algum tempo que não uso ADO, por isso não sei se ele vai suportar o código abaixo, mas não custa nada tentar.
DMTransfere.ADOQuery3.Close;
DMTransfere.ADOQuery3.SQL.Clear;
DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque ');
DMTransfere.ADOQuery3.SQL.Add('where referencia in (select campo from tabela');
DMTransfere.ADOQuery3.Open;

Substitua [campo] pelo campo da sua tabela e [tabela] por sua tabela que tem os códigos de referência.


Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

Estrutura 01

DMTransfere.ADOQuery1.Close;
DMTransfere.ADOQuery1.SQL.Clear;
DMTransfere.ADOQuery1.SQL.Add('select referencia,descricao,quantidade,unitario_real,total_liq from ITENS_PED_ORCAMENTO');
DMTransfere.ADOQuery1.SQL.Add('where CODIGO = :Edt_numero');
DMTransfere.ADOQuery1.Parameters.ParamByName('Edt_numero').Value := StrToInt(Edt_numero.text);
DMTransfere.ADOQuery1.Open;

if not (DMTransfere.ADOQuery1.IsEmpty) then
ShowMessage('Localizado com Sucesso!')
else
ShowMessage('Nenhum registro encontrado');

Estrutura 02

//DMTransfere.ADOQuery3.Close;
//DMTransfere.ADOQuery3.SQL.Clear;
//DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque where referencia =:pref');
//DMTransfere.ADOQuery3.Parameters.ParamByName('pref').value := DMTransfere.ADOQuery1.FieldByName('referencia').AsString;
//DMTransfere.ADOQuery3.Open;
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

Estrutura 01

DMTransfere.ADOQuery1.Close;
DMTransfere.ADOQuery1.SQL.Clear;
DMTransfere.ADOQuery1.SQL.Add('select referencia,descricao,quantidade,unitario_real,total_liq from ITENS_PED_ORCAMENTO');
DMTransfere.ADOQuery1.SQL.Add('where CODIGO = :Edt_numero');
DMTransfere.ADOQuery1.Parameters.ParamByName('Edt_numero').Value := StrToInt(Edt_numero.text);
DMTransfere.ADOQuery1.Open;

if not (DMTransfere.ADOQuery1.IsEmpty) then
ShowMessage('Localizado com Sucesso!')
else
ShowMessage('Nenhum registro encontrado');

Estrutura 02

//DMTransfere.ADOQuery3.Close;
//DMTransfere.ADOQuery3.SQL.Clear;
//DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque where referencia =:pref');
//DMTransfere.ADOQuery3.Parameters.ParamByName('pref').value := DMTransfere.ADOQuery1.FieldByName('referencia').AsString;
//DMTransfere.ADOQuery3.Open;


O colega poderia testar o código abaixo?
DMTransfere.ADOQuery3.Close;
DMTransfere.ADOQuery3.SQL.Clear;
DMTransfere.ADOQuery3.SQL.Add('select referencia,descricao from estoque ');
DMTransfere.ADOQuery3.SQL.Add('where referencia in (select referencia from ITENS_PED_ORCAMENTO');
DMTransfere.ADOQuery3.Open;

Se não funcionar, poderemos tentar de outra forma.

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

---------------------------
Transfere
---------------------------
Incorrect syntax near 'ITENS_PED_ORCAMENTO'
---------------------------
OK
---------------------------
apresentou o sequinte erro acima, mas isso pq a query1 ele busca esses itens no banco1, a query3 estou validando de acordo com o filtro da referencia pra poder copiar pro DB , pra ai sim lançar na tabela ITENS_PED_ORCAMENTO do banco 2.
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

---------------------------
Transfere
---------------------------
Incorrect syntax near 'ITENS_PED_ORCAMENTO'
---------------------------
OK
---------------------------
apresentou o sequinte erro acima, mas isso pq a query1 ele busca esses itens no banco1, a query3 estou validando de acordo com o filtro da referencia pra poder copiar pro DB , pra ai sim lançar na tabela ITENS_PED_ORCAMENTO do banco 2.


Seu banco de dados é SQL Server?

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

sim,os 2 bancos estao no mesmo servidor
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

sim,os 2 bancos estao no mesmo servidor


Veja se o conteúdo deste artigo te dá uma idéia de como fazer a cópia, qualquer coisa, retorne ao fórum.

[url]https://www.devmedia.com.br/copiando-dados-de-um-banco-para-outro/20247[/url]

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

Primeiramente obrigado pela força Perivaldo e olhei o post publicado e fui fazer aqui mas deu esse erro

Update or insert of view or function 'banco2_sql.dbo.ITENS_PED_ORCAMENTO' failed because it contains a derived or constant field.
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

Primeiramente obrigado pela força Perivaldo e olhei o post publicado e fui fazer aqui mas deu esse erro

Update or insert of view or function 'banco2_sql.dbo.ITENS_PED_ORCAMENTO' failed because it contains a derived or constant field.


Post sua instrução, como você fez. Você usou ADOQuery?

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

DMTransfere.ADOQuery4.Close;
DMTransfere.ADOQuery4.SQL.Clear;
DMTransfere.ADOQuery4.SQL.Add('insert into banco2_sql.dbo.ITENS_PED_ORCAMENTO');
DMTransfere.ADOQuery4.SQL.Add('select * from banco1_sql.dbo.ITENS_PED_ORCAMENTO where CODIGO=:Edt_numero');
DMTransfere.ADOQuery4.Parameters.ParamByName('Edt_numero').Value := StrToInt(Edt_numero.text);
DMTransfere.ADOQuery4.Open
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

DMTransfere.ADOQuery4.Close;
DMTransfere.ADOQuery4.SQL.Clear;
DMTransfere.ADOQuery4.SQL.Add('insert into banco2_sql.dbo.ITENS_PED_ORCAMENTO');
DMTransfere.ADOQuery4.SQL.Add('select * from banco1_sql.dbo.ITENS_PED_ORCAMENTO where CODIGO=:Edt_numero');
DMTransfere.ADOQuery4.Parameters.ParamByName('Edt_numero').Value := StrToInt(Edt_numero.text);
DMTransfere.ADOQuery4.Open


Você me informou que os bancos estão no mesmo servidor, então tente usar o código abaixo:
  DMTransfere.ADOQuery4.Close;
  DMTransfere.ADOQuery4.SQL.Clear;
  DMTransfere.ADOQuery4.SQL.Add('INSERT INTO banco2_sql.dbo.ITENS_PED_ORCAMENTO ');
  DMTransfere.ADOQuery4.SQL.Add('SELECT * from ITENS_PED_ORCAMENTO WHERE CODIGO = :Edt_numero');
  DMTransfere.ADOQuery4.Parameters.ParamByName('Edt_numero').Value  := StrToInt(Edt_numero.Text);
  DMTransfere.ADOQuery4.ExecSQL;

Levando em consideração que seu ADOQuery4 já está vinculado ao ADOConnection que está setado para o Banco1.

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

---------------------------
Transfere
---------------------------
An explicit value for the identity column in table 'banco2.dbo.ITENS_PED_ORCAMENTO' can only be specified when a column list is used and IDENTITY_INSERT is ON.
---------------------------
OK
---------------------------
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

---------------------------
Transfere
---------------------------
An explicit value for the identity column in table 'banco2.dbo.ITENS_PED_ORCAMENTO' can only be specified when a column list is used and IDENTITY_INSERT is ON.
---------------------------
OK
---------------------------


Muito estranho, os nomes dos seus dois bancos de dados são banco2.mdf e banco1.mdf?

Quais os nomes dos bancos?

Boa sorte e bons códigos!
GOSTEI 0
Tiago Santos

Tiago Santos

08/03/2013

consegui resolver, valeu mesmo Martins
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

08/03/2013

consegui resolver, valeu mesmo Martins

Blza! Você poderia postar a solução, pode ajudar outros no futuro.

Boa sorte e bons códigos!
GOSTEI 0
POSTAR