Con la esperanza de que esto es lo que está buscando, que esto será suficiente:
- simplemente
INSERT LedgerTransaction ...
para cada transacción del libro mayor del mundo real
Si está buscando más que eso, significa que necesita conceptos básicos de contabilidad, que no se pueden responder aquí. Consulte los Tutoriales gratuitos disponibles en la web.
SQL • Ver
He actualizado la vista de la pregunta vinculada para obtener TotalCredit
&TotalDebit
columnas, para todas las Transacciones desde el primer día del mes anterior.
CREATE VIEW Account_Current_V
AS
SELECT
AccountNo,
Date = DATEADD( DD, -1, GETDATE() ), -- show previous day
ClosingBalance,
TotalCredit = (
-- TotalCredit_Subquery
SELECT SUM( Amount )
FROM AccountTransaction
WHERE AccountNo = @AccountNo
AND XactTypeCode_Ext IN ( "AC", "Dp" )
-- this month
AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
),
TotalDebit = (
-- TotalDebit_Subquery
SELECT SUM( Amount )
FROM AccountTransaction
WHERE AccountNo = @AccountNo
AND XactTypeCode_Ext NOT IN ( "AC", "Dp" )
AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
),
CurrentBalance = ClosingBalance +
<TotalCredit_Subquery> -
<TotalDebit_Subquery>
FROM AccountStatement -- 1st day of this month
WHERE Date = CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
SQL • Fin de mes • Insertar estado de cuenta
El día 1 del nuevo mes, la idea es cerrar el mes anterior, fechado el día 1 del nuevo mes. Usamos la vista anterior para obtener el TotalCredit
&TotalDebit
columnas para todas las Transacciones desde el primer día del mes anterior.
Esta es solo una tarea en el trabajo de fin de mes, el primer día del mes. Normalmente se ejecutaría en la cola por lotes, para todas las Accounts
,con límites de control de transacciones adecuados (por ejemplo, SET ROWCOUNT 500
), etc.
INSERT AccountStatement
SELECT AccountNo,
-- Date: 1st day of this month
CONVERT( CHAR(6), GETDATE(), 2 ) + "01",
ACV.CurrentBalance,
ACV.TotalCredit,
ACV.TotalDebit
FROM Account_Current_V ACV
JOIN AccountStatement ASS
ON ACV.AccountNo = ASS.AccountNo
-- AccountStatements that are not yet MonthEnd-ed
-- get single row that is newest
WHERE ASS.Date = (
SELECT MAX( Date )
FROM AccountStatement
WHERE AccountNo = ASS.AccountNo
)
-- that is not 1st day of this month
AND ASS.Date != CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
Es lo mismo para actualizar el LedgerStatement
.
No. Mientras que la interfaz GUI está en línea, una aplicación de complejidad razonable necesita ejecutar trabajos en el servidor back-end. P.ej. Fin de mes; Copias de seguridad diarias; resúmenes del registro de transacciones; etc. En general, hay una configuración en el servidor para hacer eso, de lo contrario, debe escribir uno.
Habrá muchas Tareas que comprenden Fin de Mes. Esta es solo una de esas tareas. Hay un límite para lo que puede hacer en PHP, y no soñaría con hacer esto en PHP. Por razones técnicas y de modularidad, colocaría el código para esa tarea y todas las demás tareas de fin de mes en un proceso almacenado Account_MonthEnd_btr
.
No puedes hacerlo desde un botón porque:
-
colgará la GUI hasta que finalice la tarea de fin de mes, lo que puede demorar más de unos minutos (depende de la cantidad de
Accounts
) ,LedgerAccounts
, etc.). -
volará el registro de transacciones (si el número de
Ledgers
oAccounts
es del todo grande). Ese control también tiene que estar en la parte trasera.