Ir para conteúdo
Fórum Script Brasil
  • 0

Adicionar automaticamente parcelas de cheques


Gil Kléber

Pergunta

Olá!!!

Bom, pra finalizar o meu DBzinho de controle de Livro Caixa, resolvi adicionar um código que automatiza o preenchimento de parcelas pagas em cheques.

Tipo, paciente pagou com 10 cheques, eu preencho os campos relativos ao pagamento do primeiro cheque, informo o numero de parcelas e ele adiciona os registros em minha tabela com os campos dos cheques atualizados.

O probleminha que estou encontrando é referente ao NUMERO do cheque. Que no meu caso, é um campo TEXTO, já que tem cheque que tem NUMERO começando por letras, ex: AA-000165.

Como eu faço pra que ele "aproveite" a parte numérica que compõe o número e altere de acordo com o numero de parcelas?

Com detalhes:

Eu PREENCHO manualmente os dados da primeira folha:

TITULAR: João da Silva

BANCO: Real

VALOR: 560,00

Número do Cheque: AA-000165

Qtd. Parcelas: 10

Quando clicar no botão ADICIONAR CHEQUES ele abre minha BD, e adiciona os registros de 9 CHEQUES (já que o primeiro eu já adicionei na mão) e os numero fiquem:

AA-000166, AA-000167 ... AA-000174?

abaixo está o código que estou usando:

Dim db As Database, rs As Recordset

Dim I As Long

Set db = CurrentDb()

Set rs = db.OpenRecordset("tblLivroCaixa")

For I = 1 To Me.txtNumParcelas - 1

rs.AddNew

rs("idDentista") = Me.Dentista

rs("idTipoPagamento") = Me.Tipo

rs("data") = Me.Data

rs("valor_LC") = Me.Valor_LC

rs("discriminação") = Me.Discriminação

rs("entrada_saida") = "Entrada"

rs("bancoCheque") = Me.bancoCheque

rs("titularCheque") = Me.titularCheque

rs("dataCheque") = DateAdd("m", I, Me.dataCheque)

rs("numeroCheque") =

rs.Update

Next

rs.Close

db.Close

qualquer ajuda é bem-vinda!

Abraços pessoal!

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Coloca essa função num módulo

Public Function ProximoCheque(cheque As String) As String
    Dim codNumerico As Long
    Dim i As Integer
    Dim caracter As String

    ProximoCheque = Empty

    For i = Len(cheque) To 1 Step -1
        caracter = Mid(cheque, i, 1)
        
        If IsNumeric(caracter) Then
            Select Case caracter
                Case Is < 9:
                    ProximoCheque = Mid(cheque, 1, i - 1) & (caracter + 1) & ProximoCheque
                    Exit For
                    
                Case Is = 9:
                    If IsNumeric(Mid(cheque, i - 1, 1)) Then
                        ProximoCheque = 0 & ProximoCheque
                        
                    Else
                        ProximoCheque = 10 & ProximoCheque
                        
                    End If
                    
            End Select
        
        Else
            ProximoCheque = caracter & ProximoCheque
        End If
        
    Next i
    
End Function
e depois chama ela assim, cria uma variavel nCheque do tipo string e faz assim
Dim nCheque As String
.
.
.
nCheque = Me.numeroCheque
.
.
.
rs("numeroCheque") = nCheque

If I < (Me.txtNumParcelas - 1) Then
      nCheque = ProximoCheque(nCheque)
End If
.
.
.

Link para o comentário
Compartilhar em outros sites

  • 0

Iceguy, obrigado pela ajuda.

Eu tentei entender o código e desisti.. rsrs muito avançado pra mim. No entanto, segui as suas instruções (suponho que fiz tudo certo) e não funcionou.

No caso do cheque numero AA-000167 temos 2 problemas:

1- No caso de 3 cheques, a numeração deveria ser:

- 22/03/2011 - AA-000167

- 22/04/2011 - AA-000168

- 22/05/2011 - AA-000169

Ficou assim:

- 22/03/2011 - AA-000167 (esse é o que eu digito)

- 22/04/2011 - AA-000168

- 22/05/2011 - AA-000167 (repetiu)

No caso do cheque numero 000165 (sem nenhuma letra) ele repete o MESMO numero pra todos os cheques.

Como não tem como prever como será o numero de cheques, teria que ser algo que, não sei, de repente "extraisse" do numero apenas os caracteres NUMERICOS e somasse com a quantidade de parcelas de cheques, um a um...

Concorda comigo?

Link para o comentário
Compartilhar em outros sites

  • 0

Opa...

Fiz sem testar, mas corrigi uns negocinhos na função

Public Function ProximoCheque(cheque As String) As String
    Dim i As Integer
    Dim caracter As String

    ProximoCheque = Empty

    For i = Len(cheque) To 1 Step -1
        caracter = Mid(cheque, i, 1)
        
        If IsNumeric(caracter) Then
            Select Case caracter
                Case Is < 9:
                    ProximoCheque = Mid(cheque, 1, i - 1) & (caracter + 1) & ProximoCheque
                    Exit For
                    
                Case Is = 9:
                    If IsNumeric(Mid(cheque, i - 1, 1)) Then
                        ProximoCheque = 0 & ProximoCheque
                        
                    Else
                        ProximoCheque = Mid(cheque, 1, i - 1) & 10 & ProximoCheque
                        Exit For
                        
                    End If
                    
            End Select
        
        Else
            ProximoCheque = caracter & ProximoCheque
        End If
        
    Next i
    
End Function
Seu código fica assim:
Dim db As Database, rs As Recordset
Dim I As Long
Dim nCheque As String

nCheque = Me.numeroCheque

Set db = CurrentDb()
Set rs = db.OpenRecordset("tblLivroCaixa")

For I = 1 To Me.txtNumParcelas - 1
rs.AddNew
rs("idDentista") = Me.Dentista
rs("idTipoPagamento") = Me.Tipo
rs("data") = Me.Data
rs("valor_LC") = Me.Valor_LC
rs("discriminação") = Me.Discriminação
rs("entrada_saida") = "Entrada"
rs("bancoCheque") = Me.bancoCheque
rs("titularCheque") = Me.titularCheque
rs("dataCheque") = DateAdd("m", I, Me.dataCheque)
rs("numeroCheque") = nCheque

If I < (Me.txtNumParcelas - 1) Then
      nCheque = ProximoCheque(nCheque)
End If

rs.Update
Next
rs.Close
db.Close

Link para o comentário
Compartilhar em outros sites

  • 0

opa Iceguy.. eu fiz o teste com o numero 12342 e ficou assim:

12342 - 24/03 (digitado por mim)

12342 - 24/04 (ele repetiu o codigo)

12343 - ....

12344 - ....

consegui um código que funcionou perfeitamente. são 2 funções. Uma que extrai as letras e uma que extrai os numeros. Depois o form faz a junção.. aqui está:

Public Function ExtraiNumeros(ByVal sString As String) As String

'By JPaulo ® Maximo Access

Dim i As Integer

For i = 1 To Len(sString)

If Mid(sString, i, 1) Like "[0-9]" Then

ExtraiNumeros = ExtraiNumeros + Mid(sString, i, 1)

End If

Next i

End Function

Public Function ExtraiLetras(ByVal sString As String) As String

'By JPaulo ® Maximo Access

Dim i As Integer

For i = 1 To Len(sString)

If Mid(sString, i, 1) Like "[a-z-]" Then

ExtraiLetras = ExtraiLetras + Mid(sString, i, 1)

End If

Next i

End Function

Private Sub cmdMultiplicar_Click()

Dim db As Database, rs As Recordset

Dim i As Long

' Dim nCheque As String

Set db = CurrentDb()

Set rs = db.OpenRecordset("tblLivroCaixa")

y = ExtraiLetras(Me.numeroCheque)

x = ExtraiNumeros(Me.numeroCheque)

For i = 1 To Me.txtNumParcelas - 1

rs.AddNew

rs("idDentista") = Me.Dentista

rs("idTipoPagamento") = Me.Tipo

rs("data") = Me.Data

rs("valor_LC") = Me.Valor_LC

rs("discriminação") = Me.Discriminação

rs("entrada_saida") = "Entrada"

rs("bancoCheque") = Me.bancoCheque

rs("titularCheque") = Me.titularCheque

rs("dataCheque") = DateAdd("m", i, Me.dataCheque)

'rs("numeroCheque") = Left(Me.numeroCheque, 3) & "000" & Right(Me.numeroCheque, 6) + i

rs("numeroCheque") = y & x + i

rs.Update

Next

rs.Close

db.Close

msgbox "As parcelas de pagamento em cheque foram multiplicadas com sucesso!"

Me.txtNumParcelas.Visible = fase

Me.saidaSaldo.SetFocus

Me.cmdMultiplicar.Visible = False

End Sub

grande abraço Iceguy!

Obrigado pela ajuda!

Link para o comentário
Compartilhar em outros sites

  • 0

E se for o cheque S3-0000127? O próximo seria S-30000128???

Essa que eu fiz faz assim:

Analiza o texto contendo o nome código do cheque do fim para o início procurando por números. Se encontrar um número ele afaz o incremento e remonta o texto e devolve ele.

Por exemplo o cheque "Ax-000129"

Caracter = caracter mais a direita não testado, ou seja, o 9

é número?

não?

retorno = caracter & retorno, ou seja, adiciona o caracter em testes mais a esquerda do retorno

sim?

Que número é?

menor que 9?

incrementa o caracter e remonta a string, devolvendo o código atualizado

é 9?

como atualizar? aí verifica o caracter a esquerda do 9, é número?

sim?

muda o 9 pra 0 e procede com a varredura, isso fará com que o próximo seja incrementado.

se eu enviar 109, ele muda o 9 pra 0 ficando 100 e verifica o próximo, 0 < 9 então ele incrementa

e retorna 110.

não?

muda o 9 para 10 e remonta a string. Se eu passar A-99 ele vê o primeiro 9 e muda pra 0 porque

a esquerda tem número, vê o segundo 9 e percebe que a esquerda não é número, então ele joga

10 e remonta a string, retornando A-100

Então, ele analiza o 9 e como a esquerda dele tem um número ele muda o 9 pra 0 e vê o próximo que é o 2, incrementa pra 3 e retorna "Ax-000130"

Na questão que fiz sobre o outro código, a função que eu fiz retorna S3-0000128

Esse seu código calcula somente os cheques seguintes? Esse que você digitou já é adicionado ao sistema e você precisa só dos seguintes? Se for é só trocar a ordem da gravação pelo incremento e remover o If e a inicialização da variável, ficando assim:

im db As Database, rs As Recordset
Dim I As Long
Dim nCheque As String

Set db = CurrentDb()
Set rs = db.OpenRecordset("tblLivroCaixa")

For I = 1 To Me.txtNumParcelas - 1
rs.AddNew
rs("idDentista") = Me.Dentista
rs("idTipoPagamento") = Me.Tipo
rs("data") = Me.Data
rs("valor_LC") = Me.Valor_LC
rs("discriminação") = Me.Discriminação
rs("entrada_saida") = "Entrada"
rs("bancoCheque") = Me.bancoCheque
rs("titularCheque") = Me.titularCheque
rs("dataCheque") = DateAdd("m", I, Me.dataCheque)

nCheque = ProximoCheque(nCheque)
rs("numeroCheque") = nCheque

rs.Update
Next
rs.Close
db.Close

Editado por Iceguy
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...