UNIR DUAS TABELAS PARA IMPRESSAO

WEBIER 28/05/2004 08:46:43
#27132
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?

VB6MASTER 28/05/2004 20:18:53
#27296
Resposta escolhida
Veja seu código
   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+.
VB6MASTER 30/05/2004 11:58:59
#27374
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
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+
VB6MASTER 30/05/2004 12:03:32
#27376
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+
VB6MASTER 03/06/2004 08:05:08
#27918
Desculpe Webier, mas estive sem conexão por estes dias.
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?
VB6MASTER 07/06/2004 20:42:38
#28623
Já entendi o que está acontecendo.
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