Executing Stored Procedures From C/AL

aisnet
Member Posts: 4
The following is a real world example of how can you execute and get data from SQL Stored Procedures.
SQL Server Stored Procedure
The following code is a stored procedure that generates a logistics company's Shipment No.:
/********************************************************************************************************************** *** AISNET-IT
***
*** Changes Log:
***
*** 20100709-PAP:
*** Generates a TourLine Logictics Shipment No. using post codes, service code and item code.
***
**********************************************************************************************************************/
CREATE PROCEDURE TOURLINE_NewShipment
(@SourceBranchCode VARCHAR(6)
, @ToPostCode VARCHAR(10)
, @ServiceType VARCHAR(3)
)
AS
DECLARE @vNewShipment VARCHAR(20);
DECLARE @vServiceType VARCHAR(3);
DECLARE @vNextShipmentNo INT;
DECLARE @vNextSUBShipmentNo INT;
DECLARE @ToBranchCode VARCHAR(6);
DECLARE @vFlag INT;
BEGIN
SET @vNewShipment = 'ERROR';
SET @vFlag = 0;
/*** Component: Next Shipment No. ***/
/******************************/
SET @vNextSUBShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE2') + 1;
IF (@vNextSUBShipmentNo > 999) BEGIN
SET @vFlag = 1;
SET @vNextSUBShipmentNo = 1;
END
UPDATE [euroterminal$Generic Data]
SET Value = @vNextSUBShipmentNo
WHERE [Code] = 'TOURLINE2';
IF (@vFlag = 1) BEGIN
SET @vNextShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE') + 1;
IF (@vNextShipmentNo > 5999999)
SET @vNextShipmentNo = 5000001;
UPDATE [euroterminal$Generic Data]
SET Value = @vNextShipmentNo
WHERE [Code] = 'TOURLINE';
END ELSE BEGIN
SET @vNextShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE');
END
/*** Component: TL Branches ***/
/****************************/
SELECT @ToBranchCode = (
SELECT TOP 1 (BranchCode)
FROM TOURLINE.dbo.TL_Counties
WHERE CAST(PostCode AS INT) = @ToPostCode);
*/
/*** Component: New Shipment ***/
/********************************/
IF (@vNextSUBShipmentNo < 10) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ '00'
+ CAST(@vNextShipmentNo AS VARCHAR(1));
END
IF (@vNextSUBShipmentNo > 10 AND @vNextSUBShipmentNo < 100) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ '0'
+ CAST(@vNextShipmentNo AS VARCHAR(2));
END
IF (@vNextSUBShipmentNo > 99) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ CAST(@vNextSUBShipmentNo AS VARCHAR(3));
END
END
SELECT @vNewShipment as NewShipment;
GO
NAV Side: Codeunit
The following code is a C/AL NAV codeunit that executes and reads the stored procedure's result:
//Automations And Constants/Variables
SQLAutomation (Automation): Microsoft SQLDMO Object Library.SQLServer
SQLResponse (Automation): Microsoft SQLDMO Object Library.QueryResults
vSQLDBServer: Text Type Variable
vSQLDBServerUsername: Text Type Variable;
vSQLDBServerPassword: Text Type Variable;
SQLStoredProcedure: Text Type Variable;
vShipmentNo: Code/Text Type Variable;
//CODE: You Must Provide SQL Database Information
vSQLDBServer := <sql_databse_server>;
vSQLDBServerUsername := <sql_databse_server_username>;
vSQLDBServerPassword := <sql_databse_server_password>;
CLEAR(SQLAutomation);
CREATE(SQLAutomation);
SQLAutomation.Connect(vSQLDBServer, vSQLDBServerUsername, vSQLDBServerPassword);
SQLStoredProcedure := STRSUBSTNO('EXEC <sql_database_name>.dbo.TOURLINE_NewShipment ''%1'',''%2'',''%3'''
, <Rec:TourLine>."TourLine Code"
, <Rec:Customer>."C.P."
, <Rec:TourLine>."Service Type"
);
SQLResponse := SQLStoredProcedure.ExecuteWithResults(SQLStoredProcedure);
vShipmentNo := SQLResponse.GetColumnString(1, 1);
IF vShipmentNo = 'ERROR' THEN BEGIN
MESSAGE(SQLResponse.GetColumnString(1, 2));
EXIT;
END;
SQL Server Stored Procedure
The following code is a stored procedure that generates a logistics company's Shipment No.:
/********************************************************************************************************************** *** AISNET-IT
***
*** Changes Log:
***
*** 20100709-PAP:
*** Generates a TourLine Logictics Shipment No. using post codes, service code and item code.
***
**********************************************************************************************************************/
CREATE PROCEDURE TOURLINE_NewShipment
(@SourceBranchCode VARCHAR(6)
, @ToPostCode VARCHAR(10)
, @ServiceType VARCHAR(3)
)
AS
DECLARE @vNewShipment VARCHAR(20);
DECLARE @vServiceType VARCHAR(3);
DECLARE @vNextShipmentNo INT;
DECLARE @vNextSUBShipmentNo INT;
DECLARE @ToBranchCode VARCHAR(6);
DECLARE @vFlag INT;
BEGIN
SET @vNewShipment = 'ERROR';
SET @vFlag = 0;
/*** Component: Next Shipment No. ***/
/******************************/
SET @vNextSUBShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE2') + 1;
IF (@vNextSUBShipmentNo > 999) BEGIN
SET @vFlag = 1;
SET @vNextSUBShipmentNo = 1;
END
UPDATE [euroterminal$Generic Data]
SET Value = @vNextSUBShipmentNo
WHERE [Code] = 'TOURLINE2';
IF (@vFlag = 1) BEGIN
SET @vNextShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE') + 1;
IF (@vNextShipmentNo > 5999999)
SET @vNextShipmentNo = 5000001;
UPDATE [euroterminal$Generic Data]
SET Value = @vNextShipmentNo
WHERE [Code] = 'TOURLINE';
END ELSE BEGIN
SET @vNextShipmentNo = (
SELECT Value
FROM [euroterminal$Generic Data]
WHERE [Code] = 'TOURLINE');
END
/*** Component: TL Branches ***/
/****************************/
SELECT @ToBranchCode = (
SELECT TOP 1 (BranchCode)
FROM TOURLINE.dbo.TL_Counties
WHERE CAST(PostCode AS INT) = @ToPostCode);
*/
/*** Component: New Shipment ***/
/********************************/
IF (@vNextSUBShipmentNo < 10) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ '00'
+ CAST(@vNextShipmentNo AS VARCHAR(1));
END
IF (@vNextSUBShipmentNo > 10 AND @vNextSUBShipmentNo < 100) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ '0'
+ CAST(@vNextShipmentNo AS VARCHAR(2));
END
IF (@vNextSUBShipmentNo > 99) BEGIN
SET @vNewShipment = SUBSTRING(@SourceBranchCode, 3, 4)
+ @SourceBranchCode
--+ @ToBranchCode
--+ @ServiceType
+ CAST(@vNextShipmentNo AS VARCHAR(7))
+ CAST(@vNextSUBShipmentNo AS VARCHAR(3));
END
END
SELECT @vNewShipment as NewShipment;
GO
NAV Side: Codeunit
The following code is a C/AL NAV codeunit that executes and reads the stored procedure's result:
//Automations And Constants/Variables
SQLAutomation (Automation): Microsoft SQLDMO Object Library.SQLServer
SQLResponse (Automation): Microsoft SQLDMO Object Library.QueryResults
vSQLDBServer: Text Type Variable
vSQLDBServerUsername: Text Type Variable;
vSQLDBServerPassword: Text Type Variable;
SQLStoredProcedure: Text Type Variable;
vShipmentNo: Code/Text Type Variable;
//CODE: You Must Provide SQL Database Information
vSQLDBServer := <sql_databse_server>;
vSQLDBServerUsername := <sql_databse_server_username>;
vSQLDBServerPassword := <sql_databse_server_password>;
CLEAR(SQLAutomation);
CREATE(SQLAutomation);
SQLAutomation.Connect(vSQLDBServer, vSQLDBServerUsername, vSQLDBServerPassword);
SQLStoredProcedure := STRSUBSTNO('EXEC <sql_database_name>.dbo.TOURLINE_NewShipment ''%1'',''%2'',''%3'''
, <Rec:TourLine>."TourLine Code"
, <Rec:Customer>."C.P."
, <Rec:TourLine>."Service Type"
);
SQLResponse := SQLStoredProcedure.ExecuteWithResults(SQLStoredProcedure);
vShipmentNo := SQLResponse.GetColumnString(1, 1);
IF vShipmentNo = 'ERROR' THEN BEGIN
MESSAGE(SQLResponse.GetColumnString(1, 2));
EXIT;
END;
0
Comments
-
Using ADO automation is a better way.Looking for part-time work.
Nav, T-SQL.0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 320 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions