GERAR PARCELA

USUARIO.EXCLUIDOS 16/04/2007 11:51:17
#212075
Bem galera tenho uma tabela com nome de "tblpedidocliente" e dentro dessa tabela tenho os seguintes campos "Código", "CodCliente", "Quantidade", "Descricao" e "Total", e tenho um form onde vai ser gerado as parcelas do cliente agora o que eu quero e que gere as parcelas de acordo com a data do sistma, até ai eu sei fazer mais o porém é porque alguns messes tem 30 dias e outros tem 31 dias com essa diferença se eu pedir para gerar 10 parcela vai dar em dias totalmente desiguais com emissão do pedido como faço isso galera,
meu form tem os seguintes controles
"Código"
"CodCliente"
"Quantidade" 'quantidade de parcela a ser geradas
"Descricao"
"Total"

galera como faço para isso dar certo com esses referidos campos?
LIZANDRO 16/04/2007 12:46:03
#212088
Resposta escolhida
Vc quer gerar no mesmo dias as parcelas né ???

Se for vc pode colocar

dim iVarFor as integer

for iVarFor 0 1 to Quantidade
dataParcela = dateadd("M",1,"data inicial de suas parcela)
aqui vc coloca sua função de gravar
next

USUARIO.EXCLUIDOS 16/04/2007 16:16:02
#212134
Eu utilizo essa função de cálculo de parcelas que você pode adaptar às suas necessidades.Utilizo o OsenXpSuite + vc pode fazer para um Grid.

Public Sub CalculaParcela(vPrincipal As Double, vEntrada As Double, vJurosAM As Double, vDescontos As Double, qParcelas As Double, iList As OsenXPListBox)
Dim F(0 To 1) As Double, iCalculo As Double, i As Integer, pRin As Double, pJur As Double
pRin = CDbl(vPrincipal - vEntrada)
pJur = CDbl(vJurosAM - vDescontos)
pJur = pJur / 100
iCalculo = Abs(-Pmt(pJur, qParcelas, pRin, 0))
For i = 1 To Int(qParcelas)
F(0) = PPmt(pJur, i, qParcelas, -pRin, 0, 0)
F(0) = ((F(0) + 0.005) * 100) / 100
F(1) = iCalculo - F(0)
F(1) = ((F(1) + 0.005) * 100) / 100
iList.AddItem Format(i, "00") & vbTab & _
Format(DateAdd("m", i, Date), "DD/MM/YYYY") & _
vbTab & Format(iCalculo, "#,###,###,##0.00") & _
vbTab & Format(F(0), "#,###,###,##0.00") & _
vbTab & Format(F(1), "#,###,###,##0.00")
Next
End Sub


Private Sub Command1_Click()
'1000 = PRINCIAPL
'0 = ENTRADA
'12 = JUROS AO MÃÅ S
'0 = DESCONTOS
'6 = QUANTIDADE DE PARCELAS
Call CalculaParcela(1000, 0, 12, 0, 6, XPListBox)
End Sub

USUARIO.EXCLUIDOS 17/04/2007 09:16:57
#212217
obrigado...
USUARIO.EXCLUIDOS 17/04/2007 10:01:13
#212233
Em tempos de VB.NET , ASP.NET , Java , pode parecer um tanto ultrapassado falar sobre DAO - Data Access Object - (lembra dela ?). Pois eu não me importo com isto , pois sei que nada deve ser descartado , um dia , quando você menos espera , pode precisar !!!.

Este artigo é para os que estão iniciando e tem dúvidas em como usar o Data Control e o DBGrid. Então se você esta achando este artigo muito chato ou muito simples , lembre-se que o caminho por qual você já passou outros ainda estão passando.

Neste artigo eu vou mostrar como você pode criar uma aplicação simples , muiito simples , onde vamos gerar mensalidades para um pagamento determinado. Por exemplo , você tem um escola ou academia e quer cadastrar o seu cliente e efetuar o cálculo e geração das mensalidades que para o cliente ; depois é só ir dando baixa acusando o recebimento.(Eu não implementei uma rotina especifica para isto ; logo você vai ter que fazer isto diretamente no Grid)

A interface é simples e eu vou estar usando os controles : Data Control , DBGrid e o acesso a um banco de dados Acces com DAO. A estrutura de cada tabela é a seguinte :(você pode ajustar o projeto com mais informações)

<-Tabela Clientes <-tabela Parcelas

Vamos usar dois formulários no projeto : o formulário de cadastro para os clientes e o formulário que gera as mensalidades para cada cliente. Abaixo o layout de cada um :


O formulário que gera e controla as mensalidades O formulário de cadastro de clientes

Funciona assim: O formulário de controle de mensalidades é carregado ; para cadastrar um cliente basta clicar no botão com o sinal de (+) . A seguir para gerar as mensalidades para aquele cliente informe o valor do pagamento e o número de parcelas; clique no botão -Gerar Mensalidades e , pronto ! ; você verá as mensalidades geradas no Grid. O projeto exibe as mensalidades para cada cliente , basta navegar pelos registro da tabela clientes. O código do projeto comentado segue abaixo:

Nota : Você deve vincular o controle DBGrid ao Data Control - Data2 , definindo a propriedade DataSource do DBGrid igual a Data2 na janela de propriedades do DBGrid.

1- código da seção - General Declarations do formulário ; define as variáveis de acesso aos dados.

Dim db As Database
Dim clientes As Recordset
Dim parcelas As Recordset


2- Código do evento Click do botão (+) que permite : incluir , excluir novos clientes na base de dados :

Private Sub cmdcadastrar_Click()
If MsgBox("Deseja incluir um novo Cliente ? ", vbYesNo, "Buscar Cliente") = vbYes Then
frmcadclientes.Show vbModal
Else
Exit Sub
End If
End Sub


3- Código do evento Load do formulário - frmmensalidades - define o caminho do banco de dados -- Vendas.mdb - e as tabelas : clientes e parcleas. Oculta as colunas 0 , 1 do DBGrid. (estas colunas são respectivamente : CodigoParcelas e Codigo.). Há também um tratamento de erros bem básico para o caso das tabelas estarem sendo usadas por outro usuário.

Private Sub Form_Load()

On Error GoTo trata_erro

Set db = OpenDatabase(App.Path & "\vendas.mdb")
Set clientes = db.OpenRecordset("clientes")
Set parcelas = db.OpenRecordset("parcelas")

Data1.DatabaseName = App.Path & "\vendas.mdb"
Data1.RecordSource = "clientes"
Data2.DatabaseName = App.Path & "\vendas.mdb"
Data2.RecordSource = "parcelas"

DBGrid1.Columns(0).Visible = False
DBGrid1.Columns(1).Visible = False
DBGrid1.Columns(4).Visible = True

Exit Sub

trata_erro:
If Err.Number = 3261 Then
MsgBox " Erro : " & Err.Number & " : a tabela esta bloqueada . Verifique ! ", vbCritical, "Dados bloqueados"
Else
MsgBox Err.Number & " - " & Err.Description
End If
End Sub


End Sub


4- O código do evento Click do botão - Gera Mensalidades - :

Private Sub cmdgeramensalidades_Click()
Dim mes As Integer
Dim ano As Integer
Dim data As String

mes = Format(Now, "mm")
ano = Format(Now, "yy")

For i = 1 To Val(txtnumeroparcelas.Text)
mes = mes + 1
If mes > 12 Then
mes = 1
ano = ano + 1
End If
dia1 = Format(Now, "dd")
dia = Verifica_dia(dia1, mes)
data = dia & "/" & Format(mes, "00") & "/" & Format(ano, "00")
parcela = CCur(txtvalor.Text) / Val(txtnumeroparcelas.Text)
Data2.Recordset.AddNew
Data2.Recordset.Fields(1) = CLng(txtcodigo.Text)
Data2.Recordset.Fields(2) = Format(CDate(data), "dd/mm/yy")
Data2.Recordset.Fields(3) = CCur(parcela)
Data2.Recordset.Fields(4) = False
Data2.Recordset.Update
Next
End Sub

- Eu obtenho o mes e ano atual e a seguir inicio um laço for/next para o número de parcelas
- acrescento um ao mês e verifico se o mês é igual a 12 se for então passo p/ o ano seguinte

- a função verifica_dia ajusta o valor correto do dia quando o mesmo for igual a 31.

- a data é formatada e a parcela calculada (eu não me preocupei com arredondamentos).

- depois é só incluir os dados no recordset

- eles serão vistos no grid de imediato


5- O código abaixo é muito importante , ele é posto no evento Reposition do Data Control - Data1 - que esta associado a tabela clientess. Toda vez que mudarmos de registro na tabela clientes , estamos mudando a fonte de dados associada ao Data Control - Data2 - usando a variável txtcodigo . Como o Data2 esta associado ao DBGrid1 , o Grid exibirá os dados desta seleção.

Private Sub Data1_Reposition()
If txtcodigo.Text <> "" Then
Data2.RecordSource = "Select * from parcelas where codigo= " & CLng(txtcodigo.Text)
Data2.Refresh
End If
End Sub



6- Abaixo temos a rotina associada ao evento KeyPress do formulário que permite a simulação da tecla TAB quando usuário teclar ENTER . Basta incluí-la no formulário e definir a propriedade KeyPreview do mesmo como sendo igual a True ; fazendo assim funciona para todos os controles TextBox do formulário.

Private Sub Form_KeyPress(KeyAscii As Integer)

'Esse código permite a mudança de quadro de texto através do Enter
If KeyAscii = 13 Then
'Se o tipo do controle ativo for TextBox
If TypeOf Screen.ActiveControl Is TextBox Then
'Simula o pressionamento da tecla TAB
SendKeys "{tab}"
'A linha a seguir evita ouvir um bip
KeyAscii = 0
End If
End If
End Sub



7- Finalmente a função - Verifica_dia . Ela verifica o dia do mês para cada mês , se o dia for igual a 31 , ela atribui o valor correto para os meses seguintes das mensalidades .(O mês de fevereiro talvez requere-se um tratamento mais sofisticado para o caso de ano bissexto ).Lembre-se que as funções sempre retornam um valor. No caso eu estou retornando o dia do mês já ajustado.

Nota: No VB 6 o primeiro índice de um array é igual a zero , assim : diasDoMes(0) é igual a 31 , etc.. é por isto que eu subtraio 1 do mês atual.

Public Function Verifica_dia(dia, mes)
Dim diasDoMes As Variant

dia = Val(dia)

diasDoMes = Array(31, 28, 30, 30, 31, 30, 31, 30, 30, 31, 30, 31)

If dia = 31 Then
Verifica_dia = diasDoMes(mes - 1)
Else
Verifica_dia = dia
End If

End Function



Executando o projeto terermos as seguintes telas para a geração de mensalidades para um cliente já cadastrado:



Como você pode ver , usando uma interface simples e alguns controles vinculados básicos podemos fazer em minutos um sisteminha para resolver nosso problema...


http://www.macoratti.net/dica73.htm
Tópico encerrado , respostas não são mais permitidas