Report 1009 Job Actual To Budget
- App
- Base Application
- Namespace
- Microsoft.Projects.Project.Reports
- Versions
- 17-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Projects/Project/Reports/JobActualToBudget.Report.al418 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Projects.Project.Reports;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Journal;
using System.Utilities;
report 1009 "Job Actual To Budget"
{
AdditionalSearchTerms = 'Job Actual To Budget';
ApplicationArea = Jobs;
Caption = 'Project Actual To Budget';
ToolTip = 'Compare budgeted and usage amounts for selected projects. All lines of the selected project show quantity, total cost, and line amount.';
UsageCategory = ReportsAndAnalysis;
DefaultRenderingLayout = RDLCLayout;
dataset
{
dataitem(Job; Job)
{
RequestFilterFields = "No.", "Posting Date Filter", "Planning Date Filter";
column(TodayFormatted; Format(Today, 0, 4))
{
}
column(CompanyName; COMPANYPROPERTY.DisplayName())
{
}
column(JobTableCaptionFilter; TableCaption + ': ' + JobFilter)
{
}
column(JobFilter; JobFilter)
{
}
column(JobTaskTableCaptionFilter; "Job Task".TableCaption + ': ' + JobTaskFilter)
{
}
column(JobTaskFilter; JobTaskFilter)
{
}
column(EmptyString; '')
{
}
column(JobCalcBatchesCurrencyField; JobCalcBatches.GetCurrencyCode(Job, 0, CurrencyFieldReq))
{
}
column(JobCalcBatches3CurrencyField; JobCalcBatches.GetCurrencyCode(Job, 3, CurrencyFieldReq))
{
}
column(No_Job; "No.")
{
}
column(CurrReportPageNoCaption; CurrReportPageNoCaptionLbl)
{
}
column(JobActualToBudgetCaption; JobActualToBudgetCaptionLbl)
{
}
column(QuantityCaption; QuantityCaptionLbl)
{
}
column(ScheduleCaption; ScheduleCaptionLbl)
{
}
column(UsageCaption; UsageCaptionLbl)
{
}
column(DifferenceCaption; DifferenceCaptionLbl)
{
}
dataitem("Job Task"; "Job Task")
{
DataItemLink = "Job No." = field("No.");
DataItemTableView = sorting("Job No.", "Job Task No.");
RequestFilterFields = "Job Task No.";
column(Desc_Job; Job.Description)
{
}
column(JobTaskNo_JobTask; "Job Task No.")
{
}
column(Description_JobTask; Description)
{
}
column(JobTaskNoCaption; JobTaskNoCaptionLbl)
{
}
dataitem(FirstBuffer; "Integer")
{
DataItemTableView = sorting(Number) where(Number = filter(1 ..));
column(Amt1; Amt[1])
{
DecimalPlaces = 0 : 5;
}
column(Amt2; Amt[2])
{
DecimalPlaces = 0 : 5;
}
column(Amt3; Amt[3])
{
DecimalPlaces = 0 : 5;
}
column(Amt4; Amt[4])
{
}
column(Amt5; Amt[5])
{
}
column(Amt6; Amt[6])
{
}
column(Amt7; Amt[7])
{
}
column(Amt8; Amt[8])
{
}
column(Amt9; Amt[9])
{
}
column(JobDiffBufferType1; TempJobDiffBuffer.Type)
{
}
column(JobDiffBufferNo; TempJobDiffBuffer."No.")
{
}
column(JobDiffBufferUOMcode; TempJobDiffBuffer."Unit of Measure code")
{
}
column(JobDiffBufferWorkTypeCode; TempJobDiffBuffer."Work Type Code")
{
}
column(ShowFirstBuffer; ShowFirstBuffer)
{
}
trigger OnAfterGetRecord()
begin
Clear(ShowFirstBuffer);
Clear(Amt);
if Number = 1 then begin
if not TempJobDiffBuffer.Find('-') then
CurrReport.Break();
end else
if TempJobDiffBuffer.Next() = 0 then
CurrReport.Break();
Amt[1] := TempJobDiffBuffer.Quantity;
Amt[4] := TempJobDiffBuffer."Total Cost";
Amt[7] := TempJobDiffBuffer."Line Amount";
TempJobDiffBuffer2 := TempJobDiffBuffer;
if TempJobDiffBuffer2.Find() then begin
Amt[2] := TempJobDiffBuffer2.Quantity;
Amt[5] := TempJobDiffBuffer2."Total Cost";
Amt[8] := TempJobDiffBuffer2."Line Amount";
TempJobDiffBuffer2.Delete();
end;
Amt[3] := Amt[1] - Amt[2];
Amt[6] := Amt[4] - Amt[5];
Amt[9] := Amt[7] - Amt[8];
PrintJobTask := false;
for I := 1 to 9 do
if Amt[I] <> 0 then
PrintJobTask := true;
if not PrintJobTask then
CurrReport.Skip();
for I := 2 to 9 do begin
JTTotalAmt[I] := JTTotalAmt[I] + Amt[I];
JobTotalAmt[I] := JobTotalAmt[I] + Amt[I];
end;
ShowFirstBuffer := 1;
end;
}
dataitem(SecondBuffer; "Integer")
{
DataItemTableView = sorting(Number) where(Number = filter(1 ..));
column(JobDiffBuffer2Type1; TempJobDiffBuffer2.Type)
{
}
column(JobDiffBuffer2No; TempJobDiffBuffer2."No.")
{
}
column(JobDiffBuffer2UOMcode; TempJobDiffBuffer2."Unit of Measure code")
{
}
column(JobDiffBuffer2WorkTypeCode; TempJobDiffBuffer2."Work Type Code")
{
}
column(Amt12; Amt[1])
{
DecimalPlaces = 0 : 5;
}
column(Amt21; Amt[2])
{
DecimalPlaces = 0 : 5;
}
column(Amt39; Amt[3])
{
DecimalPlaces = 0 : 5;
}
column(Amt40; Amt[4])
{
}
column(Amt55; Amt[5])
{
}
column(Amt66; Amt[6])
{
}
column(Amt77; Amt[7])
{
}
column(Amt88; Amt[8])
{
}
column(Amt99; Amt[9])
{
}
column(ShowSecondBuffer; ShowSecondBuffer)
{
}
trigger OnAfterGetRecord()
begin
Clear(ShowSecondBuffer);
Clear(Amt);
if Number = 1 then begin
if not TempJobDiffBuffer2.Find('-') then
CurrReport.Break();
end else
if TempJobDiffBuffer2.Next() = 0 then
CurrReport.Break();
Amt[2] := TempJobDiffBuffer2.Quantity;
Amt[5] := TempJobDiffBuffer2."Total Cost";
Amt[8] := TempJobDiffBuffer2."Line Amount";
Amt[3] := Amt[1] - Amt[2];
Amt[6] := Amt[4] - Amt[5];
Amt[9] := Amt[7] - Amt[8];
PrintJobTask := false;
for I := 1 to 9 do
if Amt[I] <> 0 then
PrintJobTask := true;
if not PrintJobTask then
CurrReport.Skip();
for I := 2 to 9 do begin
JTTotalAmt[I] := JTTotalAmt[I] + Amt[I];
JobTotalAmt[I] := JobTotalAmt[I] + Amt[I];
end;
ShowSecondBuffer := 2;
end;
}
dataitem(JobTaskTotal; "Integer")
{
DataItemTableView = sorting(Number) where(Number = const(1));
column(JTTotalAmt4; JTTotalAmt[4])
{
}
column(JTTotalAmt5; JTTotalAmt[5])
{
}
column(JTTotalAmt6; JTTotalAmt[6])
{
}
column(JTTotalAmt7; JTTotalAmt[7])
{
}
column(JTTotalAmt8; JTTotalAmt[8])
{
}
column(JTTotalAmt9; JTTotalAmt[9])
{
}
column(JobTaskTableCaptionJobTask; TotalForTxt + ' ' + "Job Task".TableCaption + ' ' + "Job Task"."Job Task No.")
{
}
column(ShowTotalJobTask; (TotalForTxt + ' ' + "Job Task".TableCaption + ' ' + "Job Task"."Job Task No.") <> '')
{
}
}
trigger OnAfterGetRecord()
begin
if "Job Task Type" <> "Job Task Type"::Posting then
CurrReport.Skip();
Clear(JobCalcBatches);
JobCalcBatches.CalculateActualToBudget(
Job, "Job Task", TempJobDiffBuffer, TempJobDiffBuffer2, CurrencyFieldReq);
if not TempJobDiffBuffer.Find('-') then
if not TempJobDiffBuffer2.Find('-') then
CurrReport.Skip();
for I := 1 to 9 do
JTTotalAmt[I] := 0;
end;
}
dataitem(JobTotal; "Integer")
{
DataItemTableView = sorting(Number) where(Number = const(1));
column(JobTotalAmt4; JobTotalAmt[4])
{
}
column(JobTotalAmt5; JobTotalAmt[5])
{
}
column(JobTotalAmt6; JobTotalAmt[6])
{
}
column(JobTotalAmt7; JobTotalAmt[7])
{
}
column(JobTotalAmt8; JobTotalAmt[8])
{
}
column(JobTotalAmt9; JobTotalAmt[9])
{
}
column(ShowTotalJob; TotalForTxt + ' ' + Job.TableCaption + ' ' + Job."No." <> '')
{
}
column(JobTableCaptionNo_Job; TotalForTxt + ' ' + Job.TableCaption + ' ' + Job."No.")
{
}
}
trigger OnAfterGetRecord()
begin
for I := 1 to 9 do
JobTotalAmt[I] := 0;
end;
}
}
requestpage
{
AboutTitle = 'About Project Actual To Budget';
AboutText = 'Get an overview of actual vs. budgeted amounts for selected projects.\\Note: This report is not available in the US, Canada, and Mexico. Instead, use the Project Actual to Budget (Cost) (10210) or Project Actual to Budget (Price) (10211) reports.';
SaveValues = true;
layout
{
area(content)
{
group(Options)
{
Caption = 'Options';
field(CurrencyField; CurrencyFieldReq)
{
ApplicationArea = Jobs;
Caption = 'Currency';
OptionCaption = 'Local Currency,Foreign Currency';
ToolTip = 'Specifies the currency that amounts are shown in.';
}
}
}
}
actions
{
}
}
rendering
{
layout(RDLCLayout)
{
Type = RDLC;
LayoutFile = './Projects/Project/Reports/JobActualToBudget.rdlc';
Summary = 'Report layout made in the legacy RDLC format. Use an RDLC editor to modify the layout.';
}
}
labels
{
}
trigger OnPreReport()
begin
JobFilter := Job.GetFilters();
JobTaskFilter := "Job Task".GetFilters();
end;
var
TempJobDiffBuffer: Record "Job Difference Buffer" temporary;
TempJobDiffBuffer2: Record "Job Difference Buffer" temporary;
JobCalcBatches: Codeunit "Job Calculate Batches";
Amt: array[9] of Decimal;
JTTotalAmt: array[9] of Decimal;
JobTotalAmt: array[9] of Decimal;
CurrencyFieldReq: Option "Local Currency","Foreign Currency";
JobFilter: Text;
JobTaskFilter: Text;
PrintJobTask: Boolean;
I: Integer;
TotalForTxt: Label 'Total for';
ShowFirstBuffer: Integer;
ShowSecondBuffer: Integer;
CurrReportPageNoCaptionLbl: Label 'Page';
JobActualToBudgetCaptionLbl: Label 'Project Actual To Budget';
QuantityCaptionLbl: Label 'Quantity';
ScheduleCaptionLbl: Label 'Budget';
UsageCaptionLbl: Label 'Usage';
DifferenceCaptionLbl: Label 'Difference';
JobTaskNoCaptionLbl: Label 'Project Task No.';
procedure InitializeRequest(NewCurrencyField: Option "Local Currency","Foreign Currency")
begin
CurrencyFieldReq := NewCurrencyField;
end;
}