September 11, 2012 at 7:58 am
Hi Guys,
I am exploring the possibility of changing an inherited stored procedure to use Recursive CTE.
Basically I have 2 tables - "InventoryMaster" and "Bomstructure" - the BomStructure contains "ParentPart, Component, QtyPer, RouteNo"
The first stored procedure calls a second ;
// ------------------------
// BuildBOM1
// ------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[BuildBom1]
AS
IF (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'BOMTable') = 0
BEGIN
CREATE TABLE BOMTable(
TopLevel [char] (30) NULL ,
Parent_Rev [char] (10) NULL ,
Level[int] NULL ,
Assembly [char] (30) NULL ,
Component[char] (30) NULL ,
Component_Rev [char] (10) null,
QtyPer [decimal](12, 6) NULL ,
Route[char] (1) NULL
)
PRINT 'New table BOMTable added'
END
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BOMTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
delete from [BOMTable]
DECLARE @StockCode CHAR(30)
DECLARE MY_CURSOR CURSOR LOCAL FOR
SELECT StockCode from InvMaster
--where
--( PartCategory = 'M' or PartCategory = 'G' ) and ComponentCount > 0 and
--StockCode not in (select distinct Component from BomStructure)
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR into
@StockCode
WHILE @@FETCH_STATUS = 0
BEGIN
--Route '0'
exec BuildBom2 @StockCode,@StockCode, '0' ,0
--Route '1'
exec BuildBom2 @StockCode,@StockCode, '1' ,0
--Route '2'
exec BuildBom2 @StockCode,@StockCode, '2' ,0
--Route '3'
exec BuildBom2 @StockCode,@StockCode, '3' ,0
FETCH NEXT FROM MY_CURSOR into
@StockCode
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
select * from BOMTable
//------------------------------------------------------------------------------------ End of Procedure
//--------------------------------------------------
// BuildBOM2
// --------------------------------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[BuildBom2] @TOPLevel CHAR(30), @AtLevel CHAR(30), @Route CHAR(1), @Level int
AS
SET @Level = @Level + 1
DECLARE @ParentPart CHAR(30), @Component CHAR(30), @QtyPer Float
DECLARE MY_CURSOR CURSOR LOCAL FOR
SELECT ParentPart, Component, QtyPer, Route
from BomStructure
where ParentPart = @AtLevel AND
Route = @Route
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR into
@ParentPart, @Component, @QtyPer, @Route
WHILE @@FETCH_STATUS = 0
BEGIN
Insert into BOMTable (TopLevel, Assembly,Component,QtyPer,Route,Level)
values (@TOPLevel,@ParentPart, @Component, @QtyPer, @Route,@Level)
EXEC BuildBom2 @TOPLevel, @Component, @Route, @Level
FETCH NEXT FROM MY_CURSOR into
@ParentPart, @Component, @QtyPer,@Route
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
/* End of Procedure */
________________________________________________________________________________________________
Regards
Steve
SQL 2008 DBA/DBD - MCTS/MCITP
Please don't trust me, test the solutions I give you before using them.
September 11, 2012 at 8:02 am
SteveEClarke (9/11/2012)
Hi Guys,I am exploring the possibility of changing an inherited stored procedure to use Recursive CTE.
Basically I have 2 tables - "InventoryMaster" and "Bomstructure" - the BomStructure contains "ParentPart, Component, QtyPer, RouteNo"
The first stored procedure calls a second ;
// ------------------------
// BuildBOM1
// ------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[BuildBom1]
AS
IF (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'BOMTable') = 0
BEGIN
CREATE TABLE BOMTable(
TopLevel [char] (30) NULL ,
Parent_Rev [char] (10) NULL ,
Level[int] NULL ,
Assembly [char] (30) NULL ,
Component[char] (30) NULL ,
Component_Rev [char] (10) null,
QtyPer [decimal](12, 6) NULL ,
Route[char] (1) NULL
)
PRINT 'New table BOMTable added'
END
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BOMTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
delete from [BOMTable]
DECLARE @StockCode CHAR(30)
DECLARE MY_CURSOR CURSOR LOCAL FOR
SELECT StockCode from InvMaster
--where
--( PartCategory = 'M' or PartCategory = 'G' ) and ComponentCount > 0 and
--StockCode not in (select distinct Component from BomStructure)
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR into
@StockCode
WHILE @@FETCH_STATUS = 0
BEGIN
--Route '0'
exec BuildBom2 @StockCode,@StockCode, '0' ,0
--Route '1'
exec BuildBom2 @StockCode,@StockCode, '1' ,0
--Route '2'
exec BuildBom2 @StockCode,@StockCode, '2' ,0
--Route '3'
exec BuildBom2 @StockCode,@StockCode, '3' ,0
FETCH NEXT FROM MY_CURSOR into
@StockCode
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
select * from BOMTable
//------------------------------------------------------------------------------------ End of Procedure
//--------------------------------------------------
// BuildBOM2
// --------------------------------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[BuildBom2] @TOPLevel CHAR(30), @AtLevel CHAR(30), @Route CHAR(1), @Level int
AS
SET @Level = @Level + 1
DECLARE @ParentPart CHAR(30), @Component CHAR(30), @QtyPer Float
DECLARE MY_CURSOR CURSOR LOCAL FOR
SELECT ParentPart, Component, QtyPer, Route
from BomStructure
where ParentPart = @AtLevel AND
Route = @Route
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR into
@ParentPart, @Component, @QtyPer, @Route
WHILE @@FETCH_STATUS = 0
BEGIN
Insert into BOMTable (TopLevel, Assembly,Component,QtyPer,Route,Level)
values (@TOPLevel,@ParentPart, @Component, @QtyPer, @Route,@Level)
EXEC BuildBom2 @TOPLevel, @Component, @Route, @Level
FETCH NEXT FROM MY_CURSOR into
@ParentPart, @Component, @QtyPer,@Route
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
/* End of Procedure */
It would help if you posted the DDL for the tables, some sample data for the tables (as a series of insert into statements), and the expecte results based on the sample data you provide.
September 11, 2012 at 8:05 am
.
________________________________________________________________________________________________
Regards
Steve
SQL 2008 DBA/DBD - MCTS/MCITP
Please don't trust me, test the solutions I give you before using them.
September 11, 2012 at 8:13 am
SteveEClarke (9/11/2012)
Ths is the actual resultset ( from current SP's )TopLevel LevelAssembly Component QtyPer Route
CD150M-BS-020 1CD150M-BS-020 CD150-CI-ACW-16 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 11-0386-0115 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 12-0282-3065 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 11-0259-0125 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 12-0283-0115 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0430-8412 4.0000000
CD150M-BS-020 2CD150-CI-ACW-16 43-0763-9912 10.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0445-8132 6.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0435-8412 4.0000000
CD150M-BS-020 2CD150-CI-ACW-16 12-0284-0115 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1004-4112 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-0620-9913 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-0700-4112 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 41-0586-9911 1.0000000
CD150M-BS-020 341-0586-9911 41-0230-9912 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1445-9912 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1446-9912 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 28-0255-8011 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1036-4112 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 41-0241-6112 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 43-1506-8112 2.0000000
CD150M-BS-020 2CD150-CI-ACW-16 54-1131-9912 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0230-3612 4.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0201-6162 4.0000000
CD150M-BS-020 2CD150-CI-ACW-16 21-0230-0115 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 23-0586-9923 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0320-8412 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0301-8762 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0330-8418 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0301-8172 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0440-8132 6.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0401-8762 12.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0401-8182 12.0000000
CD150M-BS-020 2CD150-CI-ACW-16 33-0644-8132 8.0000000
CD150M-BS-020 2CD150-CI-ACW-16 33-0601-8762 8.0000000
CD150M-BS-020 2CD150-CI-ACW-16 33-0601-8182 8.0000000
CD150M-BS-020 2CD150-CI-ACW-16 47-0148-7913 1.0000000
CD150M-BS-020 347-0148-7913 47-0332-6113 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 35-0420-8412 2.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1034-5413 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1034-5423 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1034-5433 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 38-1034-5443 2.0000000
CD150M-BS-020 2CD150-CI-ACW-16 36-0646-6513 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 36-0646-6523 1.0000000
CD150M-BS-020 2CD150-CI-ACW-16 36-0646-6533 1.0000000
CD150M-BS-020 1CD150M-BS-020 MA1242 1.0000000
CD150M-BS-020 2MA1242 13-0174-0215 1.0000000
CD150M-BS-020 2MA1242 16-0400-8041 1.0000000
CD150M-BS-020 2MA1242 39-0069-9912 2.0000000
CD150M-BS-020 2MA1242 13-0172-8811 1.0000000
CD150M-BS-020 2MA1242 41-0232-9912 1.0000000
CD150M-BS-020 2MA1242 38-0809-4112 2.0000000
CD150M-BS-020 2MA1242 13-0173-0115 1.0000000
CD150M-BS-020 2MA1242 35-0225-8412 3.0000000
CD150M-BS-020 2MA1242 35-0201-8762 3.0000000
CD150M-BS-020 2MA1242 51-0003-9912 1.0000000
CD150M-BS-020 2MA1242 51-0010-9912 1.0000000
CD150M-BS-020 2MA1242 43-1048-9912 1.0000000
CD150M-BS-020 2MA1242 43-1788-9912 1.0000000
CD150M-BS-020 2MA1242 38-1033-4112 1.0000000
CD150M-BS-020 2MA1242 45-0281-8812/170 1.0000000
CD150M-BS-020 345-0281-8812/170 45-0281-8812 0.2000000
CD150M-BS-020 2MA1242 36-0650-9913 1.0000000
CD150M-BS-020 2MA1242 36-0650-9923 1.0000000
CD150M-BS-020 2MA1242 36-0650-9933 1.0000000
CD150M-BS-020 2MA1242 36-0650-9943 2.0000000
CD150M-BS-020 2MA1242 36-0650-9953 1.0000000
CD150M-BS-020 2MA1242 43-0733-9912 1.0000000
CD150M-BS-020 1CD150M-BS-020 V150-14 1.0000000
CD150M-BS-020 2V150-14 23-0590-0125 1.0000000
CD150M-BS-020 2V150-14 39-0652-1213 1.0000000
CD150M-BS-020 2V150-14 23-0591-4113 1.0000000
CD150M-BS-020 2V150-14 33-9560-8132 4.0000000
CD150M-BS-020 2V150-14 33-0501-8182 4.0000000
CD150M-BS-020 2V150-14 35-0501-8762 4.0000000
CD150M-BS-020 2V150-14 23-0592-0125 1.0000000
CD150M-BS-020 2V150-14 38-0961-4112 1.0000000
CD150M-BS-020 2V150-14 33-9540-8132 4.0000000
CD150M-BS-020 2V150-14 28-0130-9912 4.0000000
CD150M-BS-020 2V150-14 54-0923-9912 1.0000000
CD150M-BS-020 2V150-14 33-0648-8132 8.0000000
CD150M-BS-020 2V150-14 33-0601-8182 8.0000000
CD150M-BS-020 2V150-14 33-0601-8762 8.0000000
CD150M-BS-020 1CD150M-BS-020 EP25-27 1.0000000
CD150M-BS-020 2EP25-27 23-0568-2016 1.0000000
CD150M-BS-020 2EP25-27 23-0571-2016 1.0000000
CD150M-BS-020 2EP25-27 38-1013-4112 1.0000000
CD150M-BS-020 2EP25-27 38-1014-4112 1.0000000
CD150M-BS-020 2EP25-27 23-0570-2011 1.0000000
CD150M-BS-020 2EP25-27 23-0567-2011 1.0000000
CD150M-BS-020 2EP25-27 23-0412-2011 1.0000000
CD150M-BS-020 2EP25-27 39-0641-4113 1.0000000
CD150M-BS-020 1CD150M-BS-020 AC150-49 1.0000000
CD150M-BS-020 2AC150-49 49-0523-9912 1.0000000
CD150M-BS-020 2AC150-49 38-1071-5613 1.0000000
CD150M-BS-020 2AC150-49 35-0330-8412 4.0000000
CD150M-BS-020 2AC150-49 35-0301-8762 8.0000000
CD150M-BS-020 2AC150-49 26-1114-9912 1.0000000
CD150M-BS-020 2AC150-49 26-1263-9912 1.0000000
CD150M-BS-020 2AC150-49 26-1305-9915 1.0000000
CD150M-BS-020 2AC150-49 26-1407-9912 1.0000000
CD150M-BS-020 2AC150-49 33-0701-8762 1.0000000
CD150M-BS-020 2AC150-49 54-0925-9915 1.0000000
CD150M-BS-020 354-0925-9915 54-0556-9912 1.0000000
CD150M-BS-020 2AC150-49 27-2806-8211 1.0000000
CD150M-BS-020 2AC150-49 43-1204-7015 1.0000000
CD150M-BS-020 343-1204-7015 43-1204-7004 1.0000000
CD150M-BS-020 2AC150-49 43-1483-8112 1.0000000
CD150M-BS-020 2AC150-49 43-0718-9913 1.0000000
CD150M-BS-020 2AC150-49 43-1632-8112 1.0000000
CD150M-BS-020 2AC150-49 27-2805-9821 1.0000000
CD150M-BS-020 2AC150-49 35-0399-8402/110 4.0000000
CD150M-BS-020 2AC150-49 27-2775-8515 1.0000000
CD150M-BS-020 2AC150-49 35-0345-8132 4.0000000
CD150M-BS-020 2AC150-49 35-0112-8412 2.0000000
CD150M-BS-020 2AC150-49 35-0101-8182 1.0000000
CD150M-BS-020 2AC150-49 35-0101-8762 2.0000000
CD150M-BS-020 2AC150-49 54-0923-9912 1.0000000
CD150M-BS-020 2AC150-49 43-0686-9912 1.0000000
CD150M-BS-020 2AC150-49 27-3613-6513 1.0000000
CD150M-BS-020 2AC150-49 27-3613-6523 1.0000000
CD150M-BS-020 2AC150-49 27-3613-6533 1.0000000
CD150M-BS-020 2AC150-49 43-1473-8112 1.0000000
CD150M-BS-020 2AC150-49 43-0733-9912 1.0000000
CD150M-BS-020 1CD150M-BS-020 SUPP-20 1.0000000
CD150M-BS-020 2SUPP-20 27-2796-8211 1.0000000
CD150M-BS-020 2SUPP-20 35-0335-8412 2.0000000
CD150M-BS-020 2SUPP-20 35-0301-8182 2.0000000
CD150M-BS-020 2SUPP-20 35-0301-8762 2.0000000
CD150M-BS-020 1CD150M-BS-020 ACC-L-26 1.0000000
CD150M-BS-020 2ACC-L-26 47-0344-7911 1.0000000
CD150M-BS-020 347-0344-7911 47-0332-6113 1.0000000
CD150M-BS-020 1CD150M-BS-020 ACC-L-23 1.0000000
CD150M-BS-020 2ACC-L-23 34-0721-9912 4.0000000
Not much help. Need the DDL (CREATE TABLE statements) for the the source tables. Some sample data (as a series of INSERT INTO statements) for each table. Expected results based on the sample data you provide.
September 11, 2012 at 9:26 am
Ok - sorry about this ....
data to be populated - Master table - InvSteve, link to BomSteve
drop table InvSteve
go
drop table BomSteve
go
create table InvSteve
(
StockCode [char] (30) NULL,
Rev [char] (2) NULL
)
Insert into InvSteve (StockCode, Rev)
SELECT 'CD150M-BS-020','A'
UNION ALL
SELECT 'Test_Part_2','B'
UNION ALL
SELECT 'Test_Part_3','XX'
--------------------------------
create table BomSteve
(
ParentPart [char] (30) NULL,
Component [char] (30) NULL,
QtyPer [decimal] (12,6) NULL,
Route [char] (1) NULL
)
Insert into BomSteve (ParentPart, Component, QtyPer, Route )
SELECT 'CD150M-BS-020','CD150-CI-ACW-16',1.000000, 0
UNION ALL
SELECT 'CD150-CI-ACW-16','11-0386-0115',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','12-0282-3065',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','11-0259-0125',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','12-0283-0115',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','35-0430-8412',4.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','43-0763-9912',10.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','35-0445-8132',6.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','35-0435-8412',4.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','12-0284-0115',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1004-4112',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-0620-9913',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-0700-4112',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','41-0586-9911',1.000000,0
UNION ALL
SELECT '41-0586-9911','41-0230-9912',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1445-9912',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1446-9912',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','28-0255-8011',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','33-0601-8762',8.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','33-0601-8182',8.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','47-0148-7913',1.000000,0
UNION ALL
SELECT '47-0148-7913','47-0332-6113',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1034-5413',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1034-5423',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1034-5433',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','38-1034-5443',2.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','36-0646-6513',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','36-0646-6523',1.000000,0
UNION ALL
SELECT 'CD150-CI-ACW-16','36-0646-6533',1.000000,0
UNION ALL
SELECT 'CD150M-BS-020','SUPP-20',1.000000,0
UNION ALL
SELECT 'SUPP-20','27-2796-8211',1.000000,0
UNION ALL
SELECT 'SUPP-20','35-0335-8412',2.000000,0
UNION ALL
SELECT 'SUPP-20','35-0301-8182',2.000000,0
UNION ALL
SELECT 'SUPP-20','35-0301-8762',2.000000,0
UNION ALL
SELECT 'CD150M-BS-020','ACC-L-26',1.000000,0
UNION ALL
SELECT 'ACC-L-26','47-0344-7911',1.000000,0
UNION ALL
SELECT '47-0344-7911','47-0332-6113',1.000000,0
UNION ALL
SELECT 'CD150M-BS-020','ACC-L-23',1.000000,0
UNION ALL
SELECT 'ACC-L-23','34-0721-9912',4.000000,0
UNION ALL
SELECT 'Test_Part_2','Test_Part_3',99, 1
UNION ALL
SELECT 'Test_Part_3','NO_MORE_COMPONENTS',14,1
---------------------------------------------------
________________________________________________________________________________________________
Regards
Steve
SQL 2008 DBA/DBD - MCTS/MCITP
Please don't trust me, test the solutions I give you before using them.
September 11, 2012 at 10:20 am
Now, based on the data above, what is the expected output?
September 11, 2012 at 12:54 pm
I'm not sure if this gives the correct results. I can't compare it to anything but it should give you something to start with.
;WITH Sample AS(
SELECTI.StockCode,
B.ParentPart,
B.Component,
B.QtyPer,
B.Route,
0 AS [level]
from #BomSteve B
JOIN #InvSteve I ON I.StockCode = B.ParentPart
UNION ALL
SELECTs.StockCode,
B.ParentPart,
B.Component,
B.QtyPer,
B.Route,
s.[level] + 1 AS [level]
from Sample s
JOIN #BomSteve B ON s.Component = B.ParentPart
)
SELECT *
FROM Sample
ORDER BY StockCode, [level], ParentPart, Component
September 12, 2012 at 1:17 am
Brilliant - that is exactly what I was after.
Thank you for your assistance
________________________________________________________________________________________________
Regards
Steve
SQL 2008 DBA/DBD - MCTS/MCITP
Please don't trust me, test the solutions I give you before using them.
Viewing 8 posts - 1 through 8 (of 8 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy