Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

srnalim

Problemão Programa pra ler dados de dar update em outra tabela

Recommended Posts

Bom galera estou com uma necessidade complicada, tenho um documento em excel o seguinte

 

codbarra | estoque

 

eu preciso pegar os dados desses codigo de barra buscar ele em uma tebela se existir atualizar o campo estoque da outra tabela, fiz assim mas nao funcionar

 


procedure TForm1.BitBtn3Click(Sender: TObject);
var
EXCEL: Variant;
w,x,y,z: integer;
d1,d2,d3,d4,d5: string;
c : AnsiString;
begin
EXCEL := CREATEOLEOBJECT('Excel.Application');
EXCEL.VISIBLE:=FALSE;
EXCEL.WORKBOOKS.OPEN(opendialog1.FileName);
z:= stringgrid1.RowCount;
for y:=1 to z do
begin
    if  pos(dbgrid1.SelectedField.AsString, EXCEL.WORKBOOKS[1].SHEETS[1].Cells[y+1,2]) > 0 then
      begin
        dbnavigator1.BtnClick(nbnext);
      end//begin if

end;//begin for

end;

quem puder me dar uma luz, lembrando que o banco de dados que irá inserir é firebird. vlw gente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo.

 

Vamos quebrar em partes menores para depois resolver como um todo.

 

Para fazer esse tipo de coisa, de preferência para trabalhar com procedures, assim você centraliza seu código e pode acabar reaproveitando ela em outra situação também.

 

Você poderia criar uma rotina semelhante a essa. Estou criando um componente TQuery, mas você pode substituir pelo que esteja trabalhando.

 

procedure AtualizaEstoque( vBarra: String; vEstoque: Real );

var

qryAtu: TQuery;

begin

try

qryAtu := TQuery.Create(self);

qryAtu.DatabaseName := 'BD';

 

qryAtu.Close;

qryAtu.SQL.Text := 'SELECT BARRA FROM TABELA WHERE BARRA = :BARRA';

qryAtu.Params[0].AsString := vBarra;

qryAtu.Open;
// Se a tabela não estiver vazia, significa que encontrou o registro, então atualiza
if not qryAtu.IsEmpty then

begin

qryAtu.Close;

qryAtu.SQL.Text := 'UPDATE TABELA SET COLUNA = :COLUNA WHERE BARRA = :BARRA';

qryAtu.Params[0].AsFloat := vEstoque;

qryAtu.Params[1].AsString := vBarra;

qryAtu.ExecSQL;
end;
finally

FreeAndNil( qryAtu );

end;

end;

 

Você substitui TABELA pela sua tabela de consulta e de atualização, e a COLUNA pela coluna a ser pesquisada e a ser atualizada.

 

Dentro do loop aonde você está varrendo os registros do seu Excel, você chama a rotina passando o codigo de barras e o estoque.

 

Bom, acredito que seja isso amigo.

 

Até a próxima. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara obrigado pela disponibilidade mas devo dizer que sou totalmente leigo em delphi, vamo tentar novamente talvez de um jeito mais simples. Tenho um banco de dados firebird e uma tabela no execel

 

 

Firebird (3.500 registros)

CODBARRA | ESTOQUE

 

execel (3.150 registros)

IV_PROD | INVENTARIO

 

sendo que ivprod é o codigo de barra e inventario é o estoque

 

O que eu preciso é pegar um codigo no firebird percorrer toda a tabela execel e se achar esse codigo ele pega o inventario e atualiza no estoque da tabela do firebird e pula pro proximo registro no firebird assim varrendo a tabela do excel novamente e repitindo esse processo até que a tabela do firebird seja toda percorrida.

 

Não sei se a aplicaçao pode ficar lenta, mas é isso ai to sem chao com essa duvida pois nao programado em dephi e sim em php mas a necessidade me vez partir pro delphi uma vez que no php essa aplicação daria timeout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo.

 

Qual componente você está usando para acessar o seu banco de dados?

 

Você teria que fazer algo semelhante a isso:

 

Dentro do loop aonde você está varrendo os registros do seu excel, faça o seguinte:

 

Crie duas variáveis, vCodBarra como String e vInventario como Real;

 

vCodBarra := Aqui você traz da sua planilha excel a coluna IV_PROD

vInventario := Aqui você traz da sua planilha excel a coluna INVENTARIO

 

qryAtu.Close;

qryAtu.SQL.Text := 'UPDATE TABELA SET ESTOQUE = :ESTOQUE WHERE CODBARRA = :CODBARRA';

qryAtu.Params[0].AsFloat := vInventario;

qryAtu.Params[1].AsString := vCodBarra;

qryAtu.ExecSQL;

 

Esse update só vai ser feito se encontrar o codigo de barras que está vindo da sua planilha.

 

Até a próxima. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

to usando componentesw da paleta interbase, datasource,dbgrid, stringgrid esse string grid so serve pra mim contar a quantidade de registro no excel pra eu montar o loop com for to do o excel.

 

existe outro problema que é a tabela do firebird o codigo de barra uns tem o codigo de barra real 13 posiçoes e outros so tem 4 que era um codigo de controle ja a do excel sempre tem 4 posiçoes porem com 9 zeros a esquerda e a funcao pos percorre toda string sendo assim se o codigo for 0193 no firebird e no excel existir 4193 vai bater o loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo.

 

Entendi, se você puder, me envie por MP seu projeto, acredito que deva ser bem pequeno e não precisa enviar o .exe junto. Assim que tiver um tempinho posso analisar e tentar lhe auxiliar.

 

Até a próxima. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.