Next Chapter 49 Profit And Loss Form

PROJECT SOURCE CODE

SPONSORED LINKS

Profit And Loss Form

'******************************************************************

'******************************************************************

'** Author : Samee Ullah Siddiqui

'** E-Mail : sanjaykrsxena@hotmail.com

'** Subject : Creating Profit & Loss

'** Date : Saturday, December, 20, 2003

'** Modified : Tuesday, December, 23, 2003

'******************************************************************

'******************************************************************

Dim TerminateLoop As Boolean

Dim Bmark As Variant

Private Sub CancelCmd_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dt.Value = Date

End Sub

Private Sub OKCmd_Click()

On Error GoTo ErHand

Dim i As Long

If OKCmd.Caption = "&OK" Then

If Dt.Value = "" Or (Not IsDate(Dt.Value)) Then

Unload Me

Exit Sub

End If

Dim SQL As String

If DE.PLConn.State = adStateOpen Then DE.PLConn.Close

DE.PLConn.Open ConnectString

If PLChk.Value = vbChecked Then

If Not PrepairPL(Dt.Value, DE.PLConn) Then

OKCmd.Caption = "&OK"

CancelCmd.Enabled = True

Screen.MousePointer = vbDefault

PB.Visible = False

StcLbl.Caption = ""

TerminateLoop = False

Exit Sub

End If

End If

StcLbl.Caption = "Preparing Trading Account..."

DE.PLConn.BeginTrans

'Delete Old Records from Credit Table

DE.PLConn.Execute "DELETE FROM CrPL_TEMP", , adCmdText

'Insert New Records

SQL = "INSERT INTO CrPL_TEMP SELECT ACCOUNTS.ACCODE, ACCOUNTS.ACDESC, ACCOUNTS.GRCODE, ACCOUNTS.GROUPDESC, ACCOUNTS.RECTYPE, ACCOUNTS.CASH, ACCOUNTS.ACTYPE, AcTrans.BALANCE " & _

"FROM AcTrans INNER JOIN ACCOUNTS ON AcTrans.Accode = ACCOUNTS.ACCODE WHERE RECTYPE = 'A' AND (ACTYPE ='P') AND (BALANCE < 0) ORDER BY ACCOUNTS.GRCODE, ACCOUNTS.ACDESC"

DE.PLConn.Execute SQL, i, adCmdText

Call FetchRecords("CrPL_TEMP", DE.PLConn, True)

'Delete Old Records from Debit Table

DE.PLConn.Execute "DELETE FROM DrPL_TEMP", , adCmdText

SQL = "INSERT INTO DrPL_TEMP SELECT ACCOUNTS.ACCODE, ACCOUNTS.ACDESC, ACCOUNTS.GRCODE, ACCOUNTS.GROUPDESC, ACCOUNTS.RECTYPE, ACCOUNTS.CASH, ACCOUNTS.ACTYPE, AcTrans.BALANCE " & _

"FROM AcTrans INNER JOIN ACCOUNTS ON AcTrans.Accode = ACCOUNTS.ACCODE WHERE RECTYPE = 'A' AND (ACTYPE ='P') AND (BALANCE > 0) ORDER BY ACCOUNTS.GRCODE, ACCOUNTS.ACDESC"

DE.PLConn.Execute SQL, i, adCmdText

Call FetchRecords("DrPL_TEMP", DE.PLConn, True)

'Open Temporary Table

Dim TmpRst As New ADODB.Recordset

TmpRst.CursorLocation = adUseClient

DE.PLConn.Execute "DELETE FROM PL_TEMP"

TmpRst.Open "PL_TEMP", DE.PLConn, adOpenKeyset, adLockOptimistic, adCmdTable

Dim DrRSt As New ADODB.Recordset

DrRSt.CursorLocation = adUseClient

DrRSt.Open "DrPL_TEMP", DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdTable

Do Until DrRSt.EOF Or TerminateLoop

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!RTYPE = "T" 'Trading Records

TmpRst!DRGroupCode = DrRSt!GrCode

TmpRst!DRGroupDESC = DrRSt!GROUPDESC

TmpRst!DRCode = DrRSt!AcCode

TmpRst!DRDESC = DrRSt!AcDESC

TmpRst!DrAmt = Abs(DrRSt!BALANCE)

TmpRst.Update

DrRSt.MoveNext

Loop

Dim CrRSt As New ADODB.Recordset

CrRSt.CursorLocation = adUseClient

CrRSt.Open "CrPL_TEMP", DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdTable

If TmpRst.RecordCount > 0 Then TmpRst.MoveFirst

Do Until CrRSt.EOF Or TerminateLoop

RedoDr:

If TmpRst.EOF Then

TmpRst.AddNew

TmpRst!sno = TmpRst.AbsolutePosition

TmpRst!RTYPE = "T" 'Trading Records

ElseIf Not IsNull(TmpRst!CRDESC) Then

TmpRst.MoveNext

GoTo RedoDr

End If

TmpRst!CRGroupCode = CrRSt!GrCode

TmpRst!CRGroupDESC = CrRSt!GROUPDESC

TmpRst!CRCode = CrRSt!AcCode

TmpRst!CRDESC = CrRSt!AcDESC

TmpRst!CrAmt = Abs(CrRSt!BALANCE)

TmpRst.Update

If Not TmpRst.EOF Then TmpRst.MoveNext

CrRSt.MoveNext

Loop

Dim TotalRst As New ADODB.Recordset

TotalRst.CursorLocation = adUseClient

Dim Diff, CrTotal, DrTotal, GTotal As Double

SQL = "SELECT SUM(CrAmt) AS CRAmount, SUM(DrAmt) AS DRAmount FROM PL_TEMP WHERE RTYPE = 'T'"

TotalRst.Open SQL, DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdText

CrTotal = IIf(IsNull(TotalRst!CRAmount), 0, TotalRst!CRAmount)

DrTotal = IIf(IsNull(TotalRst!DRAmount), 0, TotalRst!DRAmount)

Diff = Abs(CrTotal - DrTotal)

If Diff <> 0 Then

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

If CrTotal < DrTotal Then

TmpRst!CRDESC = "Gross Loss"

TmpRst!CrAmt = Diff

GTotal = DrTotal

ElseIf DrTotal < CrTotal Then

TmpRst!DRDESC = "Gross Profit"

TmpRst!DrAmt = Diff

GTotal = CrTotal

End If

TmpRst.Update

Else

GTotal = CrTotal 'Becoz CrTotal=DrTotal

End If

'Add Line

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CRLINE = VBA.String(20, "=")

TmpRst!DRLINE = VBA.String(20, "=")

TmpRst.Update

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CrAmt = GTotal

TmpRst!DrAmt = GTotal

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CRLINE = VBA.String(20, "=")

TmpRst!DRLINE = VBA.String(20, "=")

'Add a blank row after Trading Account

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst.Update

'Preparing Profit & Loss

'=========================

'Delete Old Records from Credit Table

DE.PLConn.Execute "DELETE FROM CrPL_TEMP", , adCmdText

'Insert New Records

SQL = "INSERT INTO CrPL_TEMP SELECT ACCOUNTS.ACCODE, ACCOUNTS.ACDESC, ACCOUNTS.GRCODE, ACCOUNTS.GROUPDESC, ACCOUNTS.RECTYPE, ACCOUNTS.CASH, ACCOUNTS.ACTYPE, AcTrans.BALANCE " & _

"FROM AcTrans INNER JOIN ACCOUNTS ON AcTrans.Accode = ACCOUNTS.ACCODE WHERE RECTYPE = 'A' AND (ACTYPE ='P') AND (BALANCE < 0) ORDER BY ACCOUNTS.GRCODE, ACCOUNTS.ACDESC"

DE.PLConn.Execute SQL, i, adCmdText

Call FetchRecords("CrPL_TEMP", DE.PLConn, False)

'Delete Old Records from Debit Table

DE.PLConn.Execute "DELETE FROM DrPL_TEMP", , adCmdText

SQL = "INSERT INTO DrPL_TEMP SELECT ACCOUNTS.ACCODE, ACCOUNTS.ACDESC, ACCOUNTS.GRCODE, ACCOUNTS.GROUPDESC, ACCOUNTS.RECTYPE, ACCOUNTS.CASH, ACCOUNTS.ACTYPE, AcTrans.BALANCE " & _

"FROM AcTrans INNER JOIN ACCOUNTS ON AcTrans.Accode = ACCOUNTS.ACCODE WHERE RECTYPE = 'A' AND (ACTYPE ='P') AND (BALANCE > 0) ORDER BY ACCOUNTS.GRCODE, ACCOUNTS.ACDESC"

DE.PLConn.Execute SQL, i, adCmdText

Call FetchRecords("DrPL_TEMP", DE.PLConn, False)

'Open Temporary Table

If DrRSt.State = adStateOpen Then DrRSt.Close

DrRSt.Open "DrPL_TEMP", DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdTable

'Insert one entry of difference

If Diff <> 0 Then

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!RTYPE = "P"

If CrTotal < DrTotal Then

TmpRst!DRDESC = "Gross Loss"

TmpRst!DrAmt = Diff

ElseIf DrTotal < CrTotal Then

TmpRst!CRDESC = "Gross Profit"

TmpRst!CrAmt = Diff

End If

TmpRst.Update

'Save then position of first record of Profit and Loss

Bmark = TmpRst.Bookmark

End If

Do Until DrRSt.EOF Or TerminateLoop

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!RTYPE = "P" 'Profit & Loss

TmpRst!DRGroupCode = DrRSt!GrCode

TmpRst!DRGroupDESC = DrRSt!GROUPDESC

TmpRst!DRCode = DrRSt!AcCode

TmpRst!DRDESC = DrRSt!AcDESC

TmpRst!DrAmt = Abs(DrRSt!BALANCE)

TmpRst.Update

If DrRSt.AbsolutePosition = 1 Then 'Save then position of first record of Profit and Loss

If IsEmpty(Bmark) Then Bmark = TmpRst.Bookmark

End If

DrRSt.MoveNext

Loop

If CrRSt.State = adStateOpen Then CrRSt.Close

CrRSt.Open "CrPL_TEMP", DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdTable

If Not IsEmpty(Bmark) Then TmpRst.Bookmark = Bmark 'Set position of first record of Profit and Loss

Do Until CrRSt.EOF Or TerminateLoop

RedoCr:

If TmpRst.EOF Then

TmpRst.AddNew

TmpRst!sno = TmpRst.AbsolutePosition

TmpRst!RTYPE = "P" 'Trading Records

ElseIf Not IsNull(TmpRst!CRDESC) Then

TmpRst.MoveNext

GoTo RedoCr

End If

TmpRst!CRGroupCode = CrRSt!GrCode

TmpRst!CRGroupDESC = CrRSt!GROUPDESC

TmpRst!CRCode = CrRSt!AcCode

TmpRst!CRDESC = CrRSt!AcDESC

TmpRst!CrAmt = Abs(CrRSt!BALANCE)

TmpRst.Update

If Not TmpRst.EOF Then TmpRst.MoveNext

CrRSt.MoveNext

Loop

'Get Total of Profit and Loss Records

SQL = "SELECT SUM(CrAmt) AS CRAmount, SUM(DrAmt) AS DRAmount FROM PL_TEMP WHERE RTYPE = 'P'"

If TotalRst.State = adStateOpen Then TotalRst.Close

TotalRst.Open SQL, DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdText

CrTotal = IIf(IsNull(TotalRst!CRAmount), 0, TotalRst!CRAmount)

DrTotal = IIf(IsNull(TotalRst!DRAmount), 0, TotalRst!DRAmount)

Diff = Abs(CrTotal - DrTotal)

If Diff <> 0 Then

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

If CrTotal < DrTotal Then

TmpRst!CRDESC = "Net Loss C/F to Balance Sheet"

TmpRst!CrAmt = Diff

GTotal = DrTotal

ElseIf DrTotal < CrTotal Then

TmpRst!DRDESC = "Net Profit C/F to Balance Sheet"

TmpRst!DrAmt = Diff

GTotal = CrTotal

End If

TmpRst.Update

Else

GTotal = CrTotal 'Becoz CrTotal=DrTotal

End If

'Add Line

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CRLINE = VBA.String(20, "=")

TmpRst!DRLINE = VBA.String(20, "=")

TmpRst.Update

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CrAmt = GTotal

TmpRst!DrAmt = GTotal

TmpRst!CRDESC = "TOTAL"

TmpRst!DRDESC = "TOTAL"

TmpRst.AddNew

TmpRst!sno = TmpRst.RecordCount

TmpRst!CRLINE = VBA.String(20, "=")

TmpRst!DRLINE = VBA.String(20, "=")

TmpRst.Update

OKCmd.Caption = "&OK"

CancelCmd.Enabled = True

Screen.MousePointer = vbDefault

PB.Visible = False

StcLbl.Caption = ""

DE.PLConn.CommitTrans

If DE.rsPLCmd.State = adStateOpen Then DE.rsPLCmd.Close

DE.rsPLCmd.Open "PL_TEMP", DE.PLConn, adOpenForwardOnly, adLockReadOnly, adCmdTable

Set PLRpt.DataSource = DE

PLRpt.Title = "PROFIT & LOSS as on " & Format(Dt.Value, "dd/mm/yyyy")

If Option1(0).Value Then

PLRpt.Show

Else

PLRpt.PrintReport

End If

Else

TerminateLoop = True

End If

ErHand:

ErrHandler "PLFrm.OKCmd_Click"

End Sub

Private Function PrepairPL(ByVal PLDate As Date, ByVal Conn As ADODB.Connection) As Boolean

Dim SQL, mAccode As String

Dim i As Integer

Dim ACRst As New ADODB.Recordset

ACRst.CursorLocation = adUseClient

SQL = "Select * From ACMAST ORDER BY ACCODE"

ACRst.Open SQL, Conn, adOpenKeyset, adLockOptimistic, adCmdText

If Not (ACRst.RecordCount > 0) Then

MsgBox "ACMAST Table having no records.", vbCritical, "Table blank"

Exit Function

End If

Dim vRst As New ADODB.Recordset

vRst.CursorLocation = adUseClient

SQL = "Select * From VOUCHER WHERE VDATE <= '" & PLDate & "'"

vRst.Open SQL, Conn, adOpenKeyset, adLockOptimistic, adCmdText

If Not (vRst.RecordCount > 0) Then

MsgBox "There is no transaction up to specified date.", vbCritical, "No Transaction"

Dt.SetFocus

Exit Function

End If

Dim AcTransRst As New ADODB.Recordset

' AcTransRst.CursorLocation = adUseServer

SQL = "Select * From AcTrans ORDER BY ACCODE"

AcTransRst.Open SQL, Conn, adOpenKeyset, adLockOptimistic, adCmdText

If AcTransRst.EOF Then

MsgBox "AcTrans Table having no records.", vbCritical, "Table blank"

Dt.SetFocus

Exit Function

End If

SQL = "UPDATE ACTRANS SET BALANCE = 0"

Conn.Execute SQL, i, adCmdText

Screen.MousePointer = vbHourglass

OKCmd.Caption = "&Abort"

CancelCmd.Enabled = False

PB.Visible = True

PB.Max = vRst.RecordCount

StcLbl.Caption = "Processing Data..."

Do Until vRst.EOF

mAccode = vRst!AcCode

Do

AcTransRst.MoveFirst

AcTransRst.Find "ACCODE = '" & mAccode & "'"

If AcTransRst.EOF Then

MsgBox "Account Code [" & mAccode & "] is not found in ACTrans Table.", vbCritical, "Record not found"

Exit Function

Else

SQL = "UPDATE ACTRANS SET BALANCE = (BALANCE + " & IIf(vRst!DrCr = "D", vRst!DrAmt, -vRst!CrAmt) & ") Where ACCODE = '" & mAccode & "'"

SQL = VBA.Replace(SQL, "--", "+")

Conn.Execute SQL, i, adCmdText

If i = 0 Then MsgBox "Posting Amount for Accound Code [" & mAccode & "] could not update in ACTRANS Table", vbCritical, "Unsuccessfull Updatation"

i = 0

End If

ACRst.MoveFirst

ACRst.Find "ACCODE = '" & mAccode & "'"

If ACRst.EOF Then

MsgBox "Account Code [" & mAccode & "] is not found in ACMAST Table.", vbCritical, "Record not found"

Exit Function

Else

If IsNull(ACRst!GrCode) Or ACRst!GrCode = "" Then

Exit Do

Else

mAccode = ACRst!GrCode

End If

End If

DoEvents

If TerminateLoop Then Exit Function

Loop

PB.Value = vRst.AbsolutePosition

vRst.MoveNext

Loop

PB.Visible = False

Screen.MousePointer = vbDefault

StcLbl.Caption = ""

PrepairPL = True

End Function

Private Function FetchRecords(ByVal tbl As String, Conn As ADODB.Connection, ByVal TradingAccount As Boolean)

Dim SQL, mAccode As String

Dim rst As New ADODB.Recordset

rst.CursorLocation = adUseClient

Dim ACRst As New ADODB.Recordset

ACRst.CursorLocation = adUseClient

ACRst.Open "ACMAST", Conn, adOpenKeyset, adLockReadOnly, adCmdTable

SQL = "SELECT * FROM " & tbl

rst.Open SQL, Conn, adOpenForwardOnly, adLockOptimistic, adCmdText

Do Until rst.EOF

If TradingAccount Then

If (rst!GrCode = "000022" Or rst!GrCode = "000024") Then

rst.MoveNext

ElseIf IsNull(rst!GrCode) Or rst!GrCode = "" Then

rst.Delete 'Delete TopMost Parent

rst.MoveNext

Else

mAccode = rst!GrCode

Do

ACRst.MoveFirst

ACRst.Find "ACCODE = '" & mAccode & "'"

If ACRst.EOF Then

MsgBox "Account Code [" & mAccode & "] is not found in ACMAST Table.", vbCritical, "Record not found"

Exit Function

Else

If (ACRst!GrCode = "000022" Or ACRst!GrCode = "000024") Then

rst.MoveNext

Exit Do

ElseIf IsNull(ACRst!GrCode) Or ACRst!GrCode = "" Then

rst.Delete 'Delete TopMost Parent

rst.MoveNext

Exit Do

Else

mAccode = ACRst!GrCode

End If

End If

Loop

End If

Else 'Profit & Loss

If (rst!GrCode = "000022" Or rst!GrCode = "000024") Then

rst.Delete 'Delete Trading Accounts

rst.MoveNext

ElseIf Not (rst!GrCode = "000022" Or rst!GrCode = "000024") Then

rst.MoveNext

ElseIf IsNull(rst!GrCode) Or rst!GrCode = "" Then

rst.Delete 'Delete TopMost Parent

rst.MoveNext

Else

mAccode = rst!GrCode

Do

ACRst.MoveFirst

ACRst.Find "ACCODE = '" & mAccode & "'"

If ACRst.EOF Then

MsgBox "Account Code [" & mAccode & "] is not found in ACMAST Table.", vbCritical, "Record not found"

Exit Function

Else

If Not (ACRst!GrCode = "000022" Or ACRst!GrCode = "000024") Then

rst.MoveNext

Exit Do

ElseIf IsNull(ACRst!GrCode) Or ACRst!GrCode = "" Then

rst.Delete 'Delete TopMost Parent

rst.MoveNext

Exit Do

Else

mAccode = ACRst!GrCode

End If

End If

Loop

End If

End If

Loop

End Function