srnalim 21 Denunciar post Postado Junho 19, 2013 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
Eisenheim 67 Denunciar post Postado Junho 20, 2013 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
srnalim 21 Denunciar post Postado Junho 20, 2013 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
Eisenheim 67 Denunciar post Postado Junho 20, 2013 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
srnalim 21 Denunciar post Postado Junho 20, 2013 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
Eisenheim 67 Denunciar post Postado Junho 20, 2013 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