UNIR DUAS TABELAS PARA IMPRESSAO
A ideia é a seguinte: tenho uma tabela chamada CLIENTE e outra chamada PARCELAS.
Toda vez que cadastramos um cliente é automaticamente criado 06 (seis) registros na tabela PARCELAS, sendo 01 matricula e 05 mensalidades.
O que eu quero?
Queria que fosse impresso assim(unir as duas tabelas):
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO 10/03/04 PAGO
0320 PEDRO 10/02/04 PAGO 15/03/04 PAGO
0420 JOAO 11/02/04 PAGO 17/03/04 PAGO 16/04/04 PAGO
e assim sucessivamente...
sendo que o codigo e o nome do cliente vem da tabela CLIENTE e as datas dos pagamentos vem da tabela PARCELAS
Ai eu fiz esse codigo:
Dim S_Codigo As String
Dim S_NOME As String
Dim S_PAGAMENTO As String
Dim S_Status As String
Dim QTDE As Integer
Dim PGTO As String, Status As String
If Combo1.Text = "" Or Combo2.Text = "" Then
MsgBox "DIAS e/ou HORARIO INEXISTENTE!" & vbCrLf & "Verifique e digite novamente.", vbInformation, "Aviso do Sistema"
Exit Sub
End If
ABRIR_BD_com_Data Me.Data1
Data1.RecordSource = "SELECT CLIENTE.CODIGO, CLIENTE.NOME, CLIENTE.MODULO, PARCELAS.* " & _
"FROM CLIENTE INNER JOIN PARCELAS ON CLIENTE.CODIGO = PARCELAS.CODIGO_ALUNO " & _
"WHERE (DIAS = '" & Combo1.Text & "') and (HORARIO = '" & Combo2.Text & "') and (MODULO = '" & cboModulo.Text & "') " & _
"ORDER BY CLIENTE.CODIGO, PARCELAS.MES"
Data1.Refresh
With Data1.Recordset
If .BOF And .EOF Then
MsgBox "Não existe esse Módulo para esse horário!", , "Aviso do Sistema"
Exit Sub
End If
Printer.FontName = "Arial"
Printer.FontSize = 8
.MoveLast
.MoveFirst
Printer.Print "CӓD."; Tab(7); "NOME"; Tab(55); "1º PGTO"; Tab(70); "STATUS"; Tab(85); "2º PAGTO"; Tab(100); "STATUS"
QTDE = .RecordCount / 6
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
Printer.Print Tab(55); IIf(IsNull(S_PAGAMENTO), "", S_PAGAMENTO);
Printer.Print Tab(70); IIf(S_Status, "Pago", "")
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = IIf(IsNull(Data1.Recordset.Fields("PAGAMENTO")), "", Data1.Recordset.Fields("PAGAMENTO"))
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
End With
Printer.EndDoc
PROBLEMA QUE ESTÃ Â ACONTECENDO:
inves de ele imprimir assim:
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO 10/03/04 PAGO
0320 PEDRO 10/02/04 PAGO 15/03/04 PAGO
ele tá imprimindo assim:
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO
0001 JOSE 10/03/04 PAGO
0001 JOSE
0001 JOSE
0001 JOSE
0001 JOSE
0320 PEDRO 10/02/04 PAGO
0320 PEDRO 15/03/04 PAGO
0320 PEDRO
0320 PEDRO
0320 PEDRO
0320 PEDRO
ou seja, não está ficando num só linha os pagamentos daquele aluno...
O aluno tendo 06 pagamentos (01 matricula + 05 parcelas) ele vai imprimir 06 linhas (uma para cada pagamento) mesmo que o pagamento ainda não tenha sido efetuado ele imprimirá uma linha.
O que devo fazer?
Toda vez que cadastramos um cliente é automaticamente criado 06 (seis) registros na tabela PARCELAS, sendo 01 matricula e 05 mensalidades.
O que eu quero?
Queria que fosse impresso assim(unir as duas tabelas):
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO 10/03/04 PAGO
0320 PEDRO 10/02/04 PAGO 15/03/04 PAGO
0420 JOAO 11/02/04 PAGO 17/03/04 PAGO 16/04/04 PAGO
e assim sucessivamente...
sendo que o codigo e o nome do cliente vem da tabela CLIENTE e as datas dos pagamentos vem da tabela PARCELAS
Ai eu fiz esse codigo:
Dim S_Codigo As String
Dim S_NOME As String
Dim S_PAGAMENTO As String
Dim S_Status As String
Dim QTDE As Integer
Dim PGTO As String, Status As String
If Combo1.Text = "" Or Combo2.Text = "" Then
MsgBox "DIAS e/ou HORARIO INEXISTENTE!" & vbCrLf & "Verifique e digite novamente.", vbInformation, "Aviso do Sistema"
Exit Sub
End If
ABRIR_BD_com_Data Me.Data1
Data1.RecordSource = "SELECT CLIENTE.CODIGO, CLIENTE.NOME, CLIENTE.MODULO, PARCELAS.* " & _
"FROM CLIENTE INNER JOIN PARCELAS ON CLIENTE.CODIGO = PARCELAS.CODIGO_ALUNO " & _
"WHERE (DIAS = '" & Combo1.Text & "') and (HORARIO = '" & Combo2.Text & "') and (MODULO = '" & cboModulo.Text & "') " & _
"ORDER BY CLIENTE.CODIGO, PARCELAS.MES"
Data1.Refresh
With Data1.Recordset
If .BOF And .EOF Then
MsgBox "Não existe esse Módulo para esse horário!", , "Aviso do Sistema"
Exit Sub
End If
Printer.FontName = "Arial"
Printer.FontSize = 8
.MoveLast
.MoveFirst
Printer.Print "CӓD."; Tab(7); "NOME"; Tab(55); "1º PGTO"; Tab(70); "STATUS"; Tab(85); "2º PAGTO"; Tab(100); "STATUS"
QTDE = .RecordCount / 6
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
Printer.Print Tab(55); IIf(IsNull(S_PAGAMENTO), "", S_PAGAMENTO);
Printer.Print Tab(70); IIf(S_Status, "Pago", "")
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = IIf(IsNull(Data1.Recordset.Fields("PAGAMENTO")), "", Data1.Recordset.Fields("PAGAMENTO"))
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
End With
Printer.EndDoc
PROBLEMA QUE ESTÃ Â ACONTECENDO:
inves de ele imprimir assim:
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO 10/03/04 PAGO
0320 PEDRO 10/02/04 PAGO 15/03/04 PAGO
ele tá imprimindo assim:
COD NOME MATRICULA STATUS 1º PGTO STATUS 2º PGTO STATUS
0001 JOSE 10/02/04 PAGO
0001 JOSE 10/03/04 PAGO
0001 JOSE
0001 JOSE
0001 JOSE
0001 JOSE
0320 PEDRO 10/02/04 PAGO
0320 PEDRO 15/03/04 PAGO
0320 PEDRO
0320 PEDRO
0320 PEDRO
0320 PEDRO
ou seja, não está ficando num só linha os pagamentos daquele aluno...
O aluno tendo 06 pagamentos (01 matricula + 05 parcelas) ele vai imprimir 06 linhas (uma para cada pagamento) mesmo que o pagamento ainda não tenha sido efetuado ele imprimirá uma linha.
O que devo fazer?
Veja seu código
Eu faria assim
Ou seja, somente imprimiria os campos NÃO NULOS. Primeiro faz-se a verificação se é uma campo nulo; se não é, então imprima; se for, não imprima.
Basicamente a lógica é essa.
Boa sorte e t+.
Printer.Print "CӓD."; Tab(7); "NOME"; Tab(55); "1º PGTO"; Tab(70); "STATUS"; Tab(85); "2º PAGTO"; Tab(100); "STATUS"
QTDE = .RecordCount / 6
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
Printer.Print Tab(55); IIf(IsNull(S_PAGAMENTO), "", S_PAGAMENTO);
Printer.Print Tab(70); IIf(S_Status, "Pago", "")
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = IIf(IsNull(Data1.Recordset.Fields("PAGAMENTO")), "", Data1.Recordset.Fields("PAGAMENTO"))
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
Eu faria assim
Printer.Print "CӓD."; Tab(7); "NOME"; Tab(55); "1º PGTO"; Tab(70); "STATUS"; Tab(85); "2º PAGTO"; Tab(100); "STATUS"
QTDE = .RecordCount / 6
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
If Not IsNull (S_PAGAMENTO) = True Then Printer.Print Tab(55); S_PAGAMENTO;
...
Ou seja, somente imprimiria os campos NÃO NULOS. Primeiro faz-se a verificação se é uma campo nulo; se não é, então imprima; se for, não imprima.
Basicamente a lógica é essa.
Boa sorte e t+.
ah tá! Perfeito.
é porque o tipo de laço usado não está adequedo.
Ao final do laço, deve haver um avanço do recordset, senão, acontece isto.
Tente assim
Boa sorte e t+
é porque o tipo de laço usado não está adequedo.
Ao final do laço, deve haver um avanço do recordset, senão, acontece isto.
Tente assim
Do While Not .EoF 'Faça enquanto não chegar ao final
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
If Not IsNull (S_PAGAMENTO) = True Then Printer.Print Tab(55); S_PAGAMENTO;
...
.MoveNext
Loop
.Close
Boa sorte e t+
Antes que eu me esqueça.
Porque você está dividindo seu RecordCount por seis ???
Desta forma, seu contador QTDE adquire um valor incorreto.
Caso você opte pelo laço FOR, retire a parte [/6]
Senão, não fará diferença por não ter utilidade, ao menos nesse trecho.
t+
Porque você está dividindo seu RecordCount por seis ???
Desta forma, seu contador QTDE adquire um valor incorreto.
Caso você opte pelo laço FOR, retire a parte [/6]
Senão, não fará diferença por não ter utilidade, ao menos nesse trecho.
t+
Desculpe Webier, mas estive sem conexão por estes dias.
Meu palpite você acertou. As linhas do laço estão como sugerido.
Você testou e o que aconteceu?
Meu palpite você acertou. As linhas do laço estão como sugerido.
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
If Not IsNull(S_PAGAMENTO) = True Then Printer.Print Tab(55); S_PAGAMENTO;
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
End With
Printer.EndDoc
Você testou e o que aconteceu?
Já entendi o que está acontecendo.
Veja essa parte de seu código
Você carrega as variáveis com os dados de seu obj. Data, antes de iniciar o loop.
Porém, manda imprimir as variáveis, que estão estáticas, ou seja, não houve qq. mudança nelas, não carregaram o próximo registro.
Experimente o seguinte e veja se dá certo.
Antes de iniciar a impressão, verifique se o [With] se refere ao seu Data1, se não, adicione-o ao [.MoveNext] - imediatamente antes. [Data1.MoveNext].
Boa sorte e t+
Veja essa parte de seu código
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
For i = 1 To QTDE
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
If Not IsNull(S_PAGAMENTO) = True Then Printer.Print Tab(55); S_PAGAMENTO;
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
End With
Printer.EndDoc
Você carrega as variáveis com os dados de seu obj. Data, antes de iniciar o loop.
Porém, manda imprimir as variáveis, que estão estáticas, ou seja, não houve qq. mudança nelas, não carregaram o próximo registro.
Experimente o seguinte e veja se dá certo.
For i = 1 To QTDE
S_Codigo = Data1.Recordset.Fields("CODIGO")
S_NOME = Data1.Recordset.Fields("NOME")
S_PAGAMENTO = Data1.Recordset.Fields("PAGAMENTO")
S_Status = Data1.Recordset.Fields("STATUS")
Printer.CurrentX = 80
Printer.Print Tab(1); S_Codigo;
Printer.Print Tab(7); S_NOME;
If Not IsNull(S_PAGAMENTO) = True Then Printer.Print Tab(55); S_PAGAMENTO;
S_Status = Data1.Recordset.Fields("STATUS")
.MoveNext
Next
End With
Printer.EndDoc
Antes de iniciar a impressão, verifique se o [With] se refere ao seu Data1, se não, adicione-o ao [.MoveNext] - imediatamente antes. [Data1.MoveNext].
Boa sorte e t+
Tópico encerrado , respostas não são mais permitidas