git-svn-id: https://192.168.0.254/svn/Proyectos.EstudioCarnicero_ProGestion/trunk@4 1b8572a8-2d6b-b84e-8c90-20ed86fa4eca
416 lines
12 KiB
ObjectPascal
416 lines
12 KiB
ObjectPascal
unit uBizFechasObra;
|
|
|
|
interface
|
|
|
|
uses
|
|
uDAInterfaces, uDADataTable;
|
|
|
|
const
|
|
TIPODETALLE_CONCEPTO = 'Concepto';
|
|
TIPODETALLE_SUBTOTAL = 'S';
|
|
TIPODETALLE_COMENTARIO = 'Comentario';
|
|
fld_POSICION = 'POSICION';
|
|
fld_TIPODETALLE = 'TIPO';
|
|
fld_IMPORTETOTAL = 'IMPORTETOTAL';
|
|
fld_CANTIDAD = 'CANTIDAD';
|
|
fld_IMPORTEUNIDAD = 'IMPORTEUNIDAD';
|
|
|
|
type
|
|
|
|
TBizFechaIniFieldRules = class(TDAFieldRules)
|
|
protected
|
|
procedure OnChange(Sender: TDACustomField); override;
|
|
end;
|
|
|
|
TBizFechaFinFieldRules = class(TDAFieldRules)
|
|
protected
|
|
procedure OnChange(Sender: TDACustomField); override;
|
|
end;
|
|
|
|
|
|
|
|
{function DarMaximaPosicion(aDataTable : TDADataTable): integer;
|
|
procedure ReasignarPosiciones(aDataTable : TDADataTable);
|
|
procedure AsignarPosicion(aDataTable : TDADataTable; IsAppend : Boolean);
|
|
|
|
function DarTotalDetalles(aDataTable : TDADataTable; TieneSubtotales : Boolean) : Currency;
|
|
procedure IntercambiarPosiciones(aDataTable : TDADataTable; Pos1, Pos2 : Integer);
|
|
}
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils, DB, Controls, Forms, Dialogs, schObrasClient_Intf, uBizObra;
|
|
{
|
|
procedure IntercambiarPosiciones(aDataTable : TDADataTable; Pos1, Pos2 : Integer);
|
|
var
|
|
ABookmark : Pointer;
|
|
AField : TDAField;
|
|
AFieldTipo : TDAField;
|
|
ACursor: TCursor;
|
|
bRecalcular : Boolean;
|
|
begin
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (IntercambiarPosicion)');
|
|
|
|
AField := aDataTable.FindField(fld_POSICION);
|
|
if not Assigned(AField) then
|
|
raise Exception.Create('Campo POSICION no encontrado (IntercambiarPosicion)');
|
|
|
|
// No importa si el TIPO no está en la lista de columnas
|
|
AFieldTipo := aDataTable.FindField(fld_TIPODETALLE);
|
|
|
|
bRecalcular := False;
|
|
ACursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
aDataTable.DisableEventHandlers;
|
|
aDataTable.DisableControls;
|
|
ABookmark := aDataTable.GetBookMark;
|
|
try
|
|
aDataTable.First;
|
|
if aDataTable.Locate(fld_POSICION, Pos1, []) then
|
|
begin
|
|
// Si alguna de las dos filas es un subtotal, hay que recalcular todo
|
|
if Assigned(AFieldTipo) and (AFieldTipo.AsString = TIPODETALLE_SUBTOTAL) then
|
|
bRecalcular := True;
|
|
|
|
aDataTable.Edit;
|
|
AField.AsInteger := -1;
|
|
aDataTable.Post;
|
|
|
|
aDataTable.First;
|
|
if aDataTable.Locate(fld_POSICION, Pos2, []) then
|
|
begin
|
|
// Si alguna de las dos filas es un subtotal, hay que recalcular todo
|
|
if Assigned(AFieldTipo) and (AFieldTipo.AsString = TIPODETALLE_SUBTOTAL) then
|
|
bRecalcular := True;
|
|
|
|
aDataTable.Edit;
|
|
AField.AsInteger := Pos1;
|
|
aDataTable.Post;
|
|
|
|
aDataTable.First;
|
|
aDataTable.Locate(fld_POSICION, -1, []);
|
|
aDataTable.Edit;
|
|
AField.AsInteger := Pos2;
|
|
aDataTable.Post;
|
|
end
|
|
else
|
|
raise Exception.Create('No se ha encontrado posición 2 (IntercambiarPosicion)');
|
|
end
|
|
else
|
|
raise Exception.Create('No se ha encontrado posición 1 (IntercambiarPosicion)');
|
|
finally
|
|
aDataTable.GotoBookmark(ABookmark);
|
|
aDataTable.EnableControls;
|
|
aDataTable.EnableEventHandlers;
|
|
if bRecalcular then
|
|
DarTotalDetalles(aDataTable, True);
|
|
Screen.Cursor := ACursor;
|
|
end;
|
|
end;
|
|
|
|
{function DarMaximaPosicion(aDataTable : TDADataTable): integer;
|
|
var
|
|
ABookmark : Pointer;
|
|
AField : TDAField;
|
|
ACursor: TCursor;
|
|
begin
|
|
//Sort(['ForeignKeyFieldofMasterDetailRelation','YourSortField'],[sdAscending, NeededOrder ]);
|
|
Result := 0;
|
|
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (DarMaximaPosicion)');
|
|
|
|
AField := aDataTable.FindField(fld_POSICION);
|
|
if not Assigned(AField) then
|
|
raise Exception.Create('Campo POSICION no encontrado (DarMaximaPosicion)');
|
|
|
|
ACursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
ABookmark := aDataTable.GetBookMark;
|
|
try
|
|
aDataTable.DisableControls;
|
|
aDataTable.First;
|
|
while not aDataTable.Eof do
|
|
begin
|
|
if AField.AsInteger > Result then
|
|
Result := AField.AsInteger;
|
|
aDataTable.Next;
|
|
end;
|
|
finally
|
|
aDataTable.GotoBookmark(ABookmark);
|
|
aDataTable.EnableControls;
|
|
Screen.Cursor := ACursor;
|
|
end;
|
|
end;}
|
|
|
|
{procedure ReasignarPosiciones(aDataTable : TDADataTable);
|
|
var
|
|
AField : TDAField;
|
|
ABookmark : Pointer;
|
|
Contador : Integer;
|
|
NumCon : Integer;
|
|
TotalConceptos : Integer;
|
|
DetallesEditados : Integer;
|
|
ACursor: TCursor;
|
|
begin
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (ReasignarNumConceptos)');
|
|
|
|
AField := aDataTable.FindField(fld_POSICION);
|
|
if not Assigned(AField) then
|
|
raise Exception.Create('Campo POSICION no encontrado (ReasignarNumConceptos)');
|
|
|
|
Contador := 1;
|
|
NumCon := 1;
|
|
TotalConceptos := aDataTable.RecordCount;
|
|
DetallesEditados := 0;
|
|
|
|
ACursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
ABookmark := aDataTable.GetBookMark;
|
|
aDataTable.DisableControls;
|
|
try
|
|
aDataTable.First;
|
|
while DetallesEditados < TotalConceptos do
|
|
begin
|
|
if aDataTable.Locate(fld_POSICION, Contador, []) then
|
|
begin
|
|
aDataTable.Edit;
|
|
AField.Value := NumCon;
|
|
Inc(NumCon);
|
|
aDataTable.Post;
|
|
Inc(DetallesEditados);
|
|
aDataTable.First;
|
|
end;
|
|
Inc(Contador);
|
|
end;
|
|
finally
|
|
aDataTable.EnableControls;
|
|
aDataTable.GotoBookmark(ABookmark);
|
|
Screen.Cursor := ACursor;
|
|
end;
|
|
end;
|
|
|
|
procedure AsignarPosicion(aDataTable : TDADataTable; IsAppend : Boolean);
|
|
var
|
|
AField : TDAField;
|
|
ABookmark : Pointer;
|
|
NumPosicion : Integer;
|
|
MaxPosicion : Integer;
|
|
ACursor: TCursor;
|
|
begin
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (AsignarPosicion)');
|
|
|
|
AField := aDataTable.FindField(fld_POSICION);
|
|
if not Assigned(AField) then
|
|
raise Exception.Create('Campo POSICION no encontrado (AsignarPosicion)');
|
|
|
|
if not IsAppend then
|
|
begin
|
|
if not aDataTable.IsEmpty then
|
|
begin
|
|
ACursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
// Mover las filas que están por debajo de la actual
|
|
MaxPosicion := DarMaximaPosicion(aDataTable);
|
|
NumPosicion := (AField.AsInteger * (-1));
|
|
ABookmark := aDataTable.GetBookMark;
|
|
try
|
|
aDataTable.First;
|
|
while aDataTable.Locate(fld_POSICION, MaxPosicion, []) do
|
|
begin
|
|
aDataTable.Edit;
|
|
AField.Value := MaxPosicion + 1;
|
|
aDataTable.Post;
|
|
aDataTable.First;
|
|
if MaxPosicion = NumPosicion then
|
|
Break
|
|
else
|
|
Dec(MaxPosicion);
|
|
end
|
|
finally
|
|
aDataTable.GotoBookmark(ABookmark);
|
|
Screen.Cursor := ACursor;
|
|
end;
|
|
end;
|
|
NumPosicion := (AField.AsInteger * (-1));
|
|
end
|
|
else begin
|
|
if aDataTable.RecordCount > 1 then
|
|
NumPosicion := DarMaximaPosicion(aDataTable) + 1
|
|
else
|
|
// Sólo hay una fila en toda la tabla
|
|
NumPosicion := (AField.AsInteger * (-1));
|
|
end;
|
|
|
|
// Asignar posición a la nueva fila
|
|
aDataTable.Edit;
|
|
AField.Value := NumPosicion;
|
|
aDataTable.Post;
|
|
end;
|
|
|
|
procedure CalcularImportesLinea(aDataTable : TDADataTable; TieneSubtotales : Boolean);
|
|
var
|
|
ACabecera : IBizImportesCabecera;
|
|
TipoField : TDAField;
|
|
TotalField : TDAField;
|
|
CantidadField : TDAField;
|
|
ImporteUnidadField : TDAField;
|
|
begin
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (CalcularImportesLinea)');
|
|
|
|
TotalField := aDataTable.FindField(fld_IMPORTETOTAL);
|
|
if not Assigned(TotalField) then
|
|
raise Exception.Create('Campo IMPORTETOTAL no encontrado (CalcularImportesLinea)');
|
|
|
|
CantidadField := aDataTable.FindField(fld_CANTIDAD);
|
|
if not Assigned(CantidadField) then
|
|
raise Exception.Create('Campo CANTIDAD no encontrado (CalcularImportesLinea)');
|
|
|
|
ImporteUnidadField := aDataTable.FindField(fld_IMPORTEUNIDAD);
|
|
if not Assigned(ImporteUnidadField) then
|
|
raise Exception.Create('Campo IMPORTEUNIDAD no encontrado (CalcularImportesLinea)');
|
|
|
|
if TieneSubtotales then
|
|
begin
|
|
TipoField := aDataTable.FindField(fld_TIPODETALLE);
|
|
if not Assigned(TipoField) then
|
|
raise Exception.Create('Campo TIPO no encontrado (CalcularImportesLinea)');
|
|
|
|
if TipoField.AsString = TIPODETALLE_SUBTOTAL then
|
|
Exit;
|
|
end;
|
|
|
|
aDataTable.Edit;
|
|
TotalField.Value := CantidadField.AsCurrency * ImporteUnidadField.AsCurrency;
|
|
aDataTable.Post;
|
|
|
|
if Assigned(aDataTable.MasterSource) and
|
|
Supports(aDataTable.MasterSource.DataTable, IBizImportesCabecera, ACabecera) then
|
|
ACabecera.CalcularImportes;
|
|
end;
|
|
|
|
function DarTotalDetalles(aDataTable : TDADataTable; TieneSubtotales : Boolean) : Currency;
|
|
var
|
|
ABookmark : Pointer;
|
|
APosicion : Integer;
|
|
MaxPos : Integer;
|
|
Total : Currency;
|
|
Subtotal : Currency;
|
|
TipoField : TDAField;
|
|
TotalField : TDAField;
|
|
ACursor: TCursor;
|
|
begin
|
|
Result := 0;
|
|
|
|
if not Assigned(aDataTable) then
|
|
raise Exception.Create('Tabla no asignada (DarTotalDetalles)');
|
|
|
|
if TieneSubtotales then
|
|
begin
|
|
TipoField := aDataTable.FindField(fld_TIPODETALLE);
|
|
if not Assigned(TipoField) then
|
|
raise Exception.Create('Campo TIPO no encontrado (DarTotalDetalles)');
|
|
|
|
{ if TipoField.AsString = TIPODETALLE_SUBTOTAL then
|
|
Exit;}
|
|
{ end;
|
|
|
|
TotalField := aDataTable.FindField(fld_IMPORTETOTAL);
|
|
if not Assigned(TotalField) then
|
|
raise Exception.Create('Campo IMPORTETOTAL no encontrado (DarTotalDetalles)');
|
|
|
|
|
|
ABookmark := aDataTable.GetBookMark;
|
|
ACursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
aDataTable.DisableControls;
|
|
|
|
APosicion := 1;
|
|
Total := 0;
|
|
Subtotal := 0;
|
|
try
|
|
MaxPos := DarMaximaPosicion(aDataTable);
|
|
while (APosicion <= MaxPos) do
|
|
begin
|
|
aDataTable.First;
|
|
if aDataTable.Locate(fld_POSICION, APosicion, []) then
|
|
begin
|
|
if TieneSubtotales and
|
|
(TipoField.AsString = TIPODETALLE_SUBTOTAL) then
|
|
begin
|
|
aDataTable.Edit;
|
|
TotalField.Value := SubTotal;
|
|
aDataTable.Post;
|
|
Total := Total + SubTotal;
|
|
Subtotal := 0;
|
|
end
|
|
else begin
|
|
Subtotal := Subtotal + TotalField.AsCurrency;
|
|
if (APosicion = MaxPos) then
|
|
Total := Total + SubTotal;
|
|
end;
|
|
Inc(APosicion);
|
|
end
|
|
else
|
|
Break;
|
|
end;
|
|
finally
|
|
Result := Total;
|
|
aDataTable.GotoBookmark(ABookmark);
|
|
aDataTable.EnableControls;
|
|
Screen.Cursor := ACursor;
|
|
end;
|
|
end;
|
|
}
|
|
|
|
|
|
|
|
{ TBizCantidadFieldRules }
|
|
|
|
procedure TBizFechaIniFieldRules.OnChange(Sender: TDACustomField);
|
|
//var
|
|
// aDetalle : IBizImportesDetalle;
|
|
begin
|
|
inherited;
|
|
showmessage('Hola Ini');
|
|
// if Supports(DataTable, IBizImportesDetalle, aDetalle) then
|
|
// CalcularImportesLinea(aDetalle.DataTable, True);
|
|
end;
|
|
|
|
procedure TBizFechaFinFieldRules.OnChange(Sender: TDACustomField);
|
|
var
|
|
AObj : IBizFechasObra;
|
|
AFechaIni: TDAField;
|
|
AFechaFin: TDAField;
|
|
begin
|
|
inherited;
|
|
// showmessage('Hola Fin');
|
|
|
|
//Sender.AsDateTime
|
|
// ComprobarFecha
|
|
if Supports(DataTable, IBizFechasObra, AObj) then
|
|
begin
|
|
AFechaIni := AObj.DataTable.FindField(fld_ObrasFECHAINIOBR);
|
|
AFechaFin := AObj.DataTable.FindField(fld_ObrasFECHAFINOBR);
|
|
case ComprobarFecha(AFechaIni.AsDateTime, AFechaFin.AsDateTime) of
|
|
0: showmessage('son Iguales');
|
|
1: showmessage('FechaIni es una fecha posterior a fechaFin');
|
|
2: showmessage('FechaFin es una fecha posterior a fechaIni');
|
|
end;
|
|
end;
|
|
// CalcularImportesLinea(aDetalle.DataTable, True);
|
|
end;
|
|
|
|
initialization
|
|
RegisterFieldRules('Client.Field.FechaIni', TBizFechaIniFieldRules);
|
|
RegisterFieldRules('Client.Field.FechaFin', TBizFechaFinFieldRules);
|
|
|
|
finalization
|
|
|
|
end.
|