COMPARAR 2 TABELAS E EDITAR CAMPO

XXXANGELSXXX 27/11/2009 21:35:08
#328719
Amigos, estou finalizando um sistema aqui, quando surgiu uma necessidade, eu tenho 2 tabelas, uma chama CADCLIENTES e a outra AUXCLIENTES, nessa tabela clientes, eu guardo as informações dos clientes, e tem um campo que chama CLISITUACAO, onde coloco se o cliente é ATIVO ou INATIVO, pois bem, preciso fazer o seguinte, eu importo para a tabela CADCLIENTES um arquivo txt com os dados do cliente, e importo para essa AUXCLIENTES outro arquivo txt com os dados de produtos que esse cliente tem, ou seja, o mesmo cliente pode ter 15 produtos por exemplo, as duas tabelas tem como codigo em como o campo codigo do cliente, entao o que eu precisava fazer, importar o arquivo produtos, e depois que importar comparar as tabelas, se na tabela AUXCLIENTES nao tivesse o codigo do cliente lancado quer dizer que o cliente é INATIVO, agora se tivesse pelo menos 1 linha na tabela AUXCLIENTES, o cliente é ativo, mais ou menos o seguinte..


CADCLIENTES AUXCLIENTES

CODIGO NOME CODIGO PRODUTO
667666 fernando 667666 mesa
667666 cadeira
667666 televisao
787877 maria -----------

Ou Seja, na tabela de clientes eu nao posso ter duplicidade no codigo, mas na tabela de produtos sim, portanto.. se tiver na auxclientes pelo menos 1 produto, tenho que Alterar o cliente para ATIVO, ou seja, o campo é text, e se nao tiver produtos na auxclientes INATIVO, vejam como estou tentando fazer.. acontece que ele nao da o loop, e nem sei se vai dar desse jeito.. rs.. rs..





SUB FU_TROCAATIVOEINATIVOS
Dim db As Database, rs As Recordset, db2 As Database, rs2 As Recordset

mensagem = MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô])
If mensagem = vbYes Then

caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]\Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase(caminho)
strsql2 = ([Ô]SELECT * FROM AuxClientes[Ô])
Set rs2 = db.OpenRecordset(strsql2, dbOpenSnapshot)
StrSql = ([Ô]SELECT * FROM CadClientes Where CliCodigo = [ô][Ô] & rs2!AuxCodigo & [Ô][ô][Ô])
Set rs = db.OpenRecordset(StrSql)
Do While Not rs.EOF
rs.Edit
rs!Clisituacao = [Ô]1-Ativo[Ô]
rs.Update
rs2.MoveNext
Loop

End If
End Sub

DESDE JA AGRADEÇO A ATENÇAO PESSOARRRRRR, E BOM FIM DE SEMANA PRA TODOS.
LLAIA 28/11/2009 04:17:58
#328729
Resposta escolhida
Dim db As Database, rs As Recordset, db2 As Database, rs2 As Recordset

mensagem = MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô])
If mensagem = vbYes Then

caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]\Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase(caminho)

StrSql = ([Ô]Select c.codigo as CodCliente, Count(a.codigo) as Qtde From CadClientes c LEFT JOIN AuxClientes a on c.codigo = a.codigo GROUP BY c.codigo[Ô])

Set rs = db.OpenRecordset(StrSql, dbOpenSnapshot)

Do While Not rs.EOF

db.Execute [Ô]update CadClientes Set Situacao =[ô][Ô] & IIf(IsNull(rs!Qtde),[Ô]1-Ativo[Ô],[Ô]2-Inativo[Ô]) & [Ô][ô] Where Codigo=[Ô] & rs!CodCliente
rs.MoveNext

Loop


Acho que deve dá certo. Se não der, vai ser por alguns detalhes.
XXXANGELSXXX 29/11/2009 11:25:18
#328782
Citação:

LLAIA escreveu:
Dim db As Database, rs As Recordset, db2 As Database, rs2 As Recordset

mensagem = MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô])
If mensagem = vbYes Then

caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase(caminho)

StrSql = ([Ô]Select c.codigo as CodCliente, Count(a.codigo) as Qtde From CadClientes c LEFT JOIN AuxClientes a on c.codigo = a.codigo GROUP BY c.codigo[Ô])

Set rs = db.OpenRecordset(StrSql, dbOpenSnapshot)

Do While Not rs.EOF

db.Execute [Ô]update CadClientes Set Situacao =[ô][Ô] & IIf(IsNull(rs!Qtde),[Ô]1-Ativo[Ô],[Ô]2-Inativo[Ô]) & [Ô][ô] Where Codigo=[Ô] & rs!CodCliente
rs.MoveNext

Loop


Acho que deve dá certo. Se não der, vai ser por alguns detalhes.

amigo, acho que vai começar a funfar sim, mas deu erro 3061, (Parametros Insuficientes, eram esperados 2), sei que isso é nome de coluna invertido, mas a renomeação através do AS que vc fez nao entendi muito bem não.. veja bem, estou somando na tabela de clientes? eu teria que fazer a junçao era na tabela auxiliar, pois é ela que pode ter varios codigos.. entendeu?, agora quanto ao nome das colunas nas tabelas ve se pode me ajudar,

CADCLIENTES AUXCLIENTES

CLICODIGO AUXCODIGO

Ou seja, eu teria que pegar o que esta importado na tabela AUXCLIENTES atraves da coluna AUXCODIGO e comparar com a tabela CADCLIENTES coluna CLICODIGO, se tiver pelo menos 1 registro ele vai marcar o campo CLISITUACAO como ativo, se nao tiver nenhum registro do cliente na tabela AUXCODIGO ele marca como inativo

Desde ja agradeço a atençaoooo...
LLAIA 29/11/2009 12:00:05
#328786
faz o seguinte cara. manda esse form com um bd access com a tabela reduzida, caso ela tenha muito resgistros pra cá. é só compactar no formato zip e anexar ao post.
XXXANGELSXXX 29/11/2009 15:45:45
#328800
Citação:

LLAIA escreveu:
faz o seguinte cara. manda esse form com um bd access com a tabela reduzida, caso ela tenha muito resgistros pra cá. é só compactar no formato zip e anexar ao post.

Amigo, nao estou postando bem o projeto nao.. mas fiz uma estruturazinha que da para entender mais ou menos.. sete o banco no arquivo INI, ok? valeu.. abraçao.
XXXANGELSXXX 30/11/2009 15:21:31
#328860
amigos, viram que coloquei o projetinho ai? alguem viu? podem ajudar? valeuuuuu
RCMRO 30/11/2009 21:57:05
#328886
Basta fazer uma única intrução SQL para fazer isso.

Após importar tudo, roda a seguinte instrução:

UPDATE      cli
SET CliSituacao = 0 -- Inativo
FROM CadClientes AS Cli
LEFT JOIN AuxClientes AS AxCli
ON AxCli.Codigo = Cli.Codigo
WHERE AxCLiente IS NULL
XXXANGELSXXX 30/11/2009 23:13:32
#328890
Citação:

RCMRO escreveu:
Basta fazer uma única intrução SQL para fazer isso.

Após importar tudo, roda a seguinte instrução:

UPDATE      cli
SET CliSituacao = 0 -- Inativo
FROM CadClientes AS Cli
LEFT JOIN AuxClientes AS AxCli
ON AxCli.Codigo = Cli.Codigo
WHERE AxCLiente IS NULL

Amigo, estou completamente crú no que vc disse.. rs rs rs.. veja se é isso mesmo...

Dim db As Database, rs As Recordset, db2 As Database, rs2 As Recordset

mensagem = MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô])
If mensagem = vbYes Then

caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]\Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase(caminho)

strsql = ([Ô]Select * From CadClientes[Ô])

Set rs = db.OpenRecordset(strsql, dbOpenSnapshot)

Do While Not rs.EOF

db.Execute [Ô]Update Cli Set CliSituacao = 0 Inativo FROM CadClientes AS Cli lEFT JOIN AuxClientes AS AxCli ON AxCli.Codigo = Cli.Codigo Where AxCLientes Is Null[Ô]

rs.MoveNext

Loop

End If



Ta dando erros ainda..
RCMRO 01/12/2009 07:57:12
#328893
Vamos lá: Foi quase...
O código abaixo é rápido e eficiente, dispensando LOOP no VB (lento e com muitos acessos ao Banco de Dados).

Private Sub VerificaStatusClientes()
Dim db As Database

If MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô]) = vbYes Then
caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]\Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase(caminho)

[ô](INI) Atualiza CliSituacao
[ô]Inicialmente, coloca todos como 1 (True) - Se já vierem com TRUE da importação, apaga este código de atualização
strsql = [Ô]UPDATE cli SET CliSituacao = 1 FROM CadClientes[Ô]
db.execute strsql
(FIM) Atualiza CliSituacao

[ô]Agora, localiza os que não têm movimento e coloca como 0 (False)
strsql = [Ô]UPDATE cli SET CliSituacao = 0 FROM CadClientes AS Cli LEFT JOIN AuxClientes AS AxCli ON AxCli.Codigo = Cli.Codigo WHERE AxCli.Codigo IS NULL[Ô]
db.execute strsql
[ô](FIM) Terminou a atualização
db.close
End If
Set db = Nothing
End Sub
LLAIA 01/12/2009 12:28:34
#328922
Dim db As Database, rs As Recordset

mensagem = MsgBox([Ô]Deseja fazer a marcação de clientes ATIVOS e INATIVOS?[Ô], vbQuestion + vbYesNo, [Ô]Checkup Service[Ô])
If mensagem = vbYes Then

caminho = ReadINI([Ô]Geral[Ô], [Ô]Caminho[Ô], App.Path & [Ô]\Config.ini[Ô])
Set db = DBEngine(0).OpenDatabase([Ô]C:\Documents and Settings\Leandro\Desktop    esteV602KVPU7C    este\HelpDesk.mdb[Ô])

StrSql = ([Ô]Select c.clicodigo as CodCliente, count(a.codcliente) as Qtde From CadClientes c LEFT JOIN AuxClientes a on c.clicodigo = a.codcliente GROUP BY c.clicodigo[Ô])

Set rs = db.OpenRecordset(StrSql, dbOpenSnapshot)

Do While Not rs.EOF

db.Execute [Ô]update CadClientes Set CliSituacao =[ô][Ô] & IIf((rs!Qtde = 0), [Ô]2-Inativo[Ô], [Ô]1-Ativo[Ô]) & [Ô][ô] Where CliCodigo=[ô][Ô] & rs!CodCliente & [Ô][ô][Ô]
rs.MoveNext

Loop

End If

MsgBox [Ô]fim[Ô]


[ô]*************************************************************************************************************


brother, simplesmente cole este código no click do command1, rodou certinho aqui. delete um registro que está com o campo CliCodigo nulo e rode. fim de papo!!
Tópico encerrado , respostas não são mais permitidas