Results 1 to 11 of 11
  1. #1
    Join Date
    Sep 2011
    Posts
    6

    Question Unanswered: SQL debugging help needed

    Hi,

    I'm using a visual basic script in Excell to get data from our database.

    Now, i'm trying to add another row to get this new "Part number" to show me data as well..

    Here is the SQL code my visual basics script creates:

    "
    SELECT distinct
    TST.[ID_TEST]
    ,TST.[DATE_TIME]
    , '4954862_R41' as DRAW_REV
    ,DATENAME(YEAR,TST.[DATE_TIME]) + '_' + DATENAME(MONTH,TST.[DATE_TIME]) + '_' + DATENAME(DAY,TST.[DATE_TIME]) AS DDAY
    ,TST.[PARTNUMBER]
    ,TRACE.[TSTPLANVERSION]
    ,TST.[INJSN]
    ,TRACE.[KITSN]
    ,TST.[STATION_ID]
    ,TST.[HEAD_NO]
    , TST.[STATION_ID] + '_' + TST.[HEAD_NO] as EOLSTATION
    ,TRACE.[SCANIAASSEMBLY]
    ,TRACE.[LASERSTRKADJLINE]
    ,TRACE.[REWORK]

    --// TP1
    ,TP1.DRAIN_TP1_LSL
    ,TP1.DRAIN_TP1
    ,TP1.DRAIN_TP1_USL
    ,TP1.DRAIN_TP1_FAIL
    ,TEST.[CUMULATEANGLE]
    ,TP1.TP1_LSL
    ,TP1.FUELING_TP1
    ,TP1.TP1_USL
    ,TP1.TP1_FAIL
    ,TP1.SOI_TP1_LSL
    ,TP1.SOI_TP1
    ,TP1.SOI_TP1_USL
    ,TP1.SOI_TP1_FAIL
    ,TP1.EOI_TP1_LSL
    ,TP1.EOI_TP1
    ,TP1.EOI_TP1_USL
    ,TP1.EOI_TP1_FAIL
    ,TP1.DUR_TP1
    ,TP1.SOISLOPE_TP1
    ,TP1.EOISLOPE_TP1
    ,TP1.AREA_TP1

    --// TP2
    ,TP2.TP2_LSL
    ,TP2.FUELING_TP2
    ,TP2.TP2_USL
    ,TP2.TP2_FAIL

    --// TP3
    ,TP3.TP3_LSL
    ,TP3.FUELING_TP3
    ,TP3.TP3_USL
    ,TP3.TP3_FAIL

    --// TP4
    ,TP4.TP4_LSL
    ,TP4.FUELING_TP4
    ,TP4.TP4_USL
    ,TP4.TP4_FAIL
    ,TP4.SOI_TP4
    ,TP4.EOI_TP4
    ,TP4.REACTORPRESS_TP4
    ,TP4.RTFMTEMP_TP4

    --// TP5
    ,TP5.TP5_LSL
    ,TP5.FUELING_TP5
    ,TP5.TP5_USL
    ,TP5.TP5_FAIL
    ,TP5.DRAIN_TP5
    ,TP5.SOI_TP5
    ,TP5.EOI_TP5_LSL
    ,TP5.EOI_TP5
    ,TP5.EOI_TP5_USL
    ,TP5.EOI_TP5_FAIL
    ,TP5.DUR_TP5
    ,TP5.SOISLOPE_TP5
    ,TP5.EOISLOPE_TP5
    ,TP5.AREA_TP5
    ,TP5.BACKPRESS_TP5
    ,TP5.DRAINBACKPRESS_TP5
    ,TP5.REACTORPRESS_TP5
    ,TP5.RTFMTEMP_TP5

    --// TP6
    ,TP6.TP6_LSL
    ,TP6.FUELING_TP6
    ,TP6.TP6_USL
    ,TP6.TP6_FAIL

    --// OVERALL DELIVERY PASS FAIL
    , CAST (TP1.TP1_FAIL as varchar(1) )
    +CAST (TP2.TP2_FAIL as varchar(1) )
    +CAST (TP3.TP3_FAIL as varchar(1) )
    +CAST (TP4.TP4_FAIL as varchar(1) )
    +CAST (TP5.TP5_FAIL as varchar(1) )
    +CAST (TP6.TP6_FAIL as varchar(1) )
    as FAIL_MASK

    -- // ASSIGN REJECT CATEGORY. DOUBLE CHECK TRIMCODE ON REJECT SINCE IF ON THE
    -- // BOUNDRARY OF THE LIMIT THE UNROUNDED VALUE CAN BE OUTSIDE THE LIMIT
    -- // (PASSFAILMASK CAN STILL BE WRONG)

    ,CASE WHEN (TRACE.[TRIMCODE] like '%BadTst%' OR TRACE.[TRIMCODE] like '%InjFail%' or TRACE.[TRIMCODE] like '%AbortCycl%' or TRACE.[TRIMCODE]='' or TRACE.[TRIMCODE] IS NULL) THEN
    --,CASE
    ( CASE
    WHEN TRACE.[TRIMCODE] like '%AbortCycl%' THEN 'ABORTED'
    WHEN TP1.DRAIN_TP1_FAIL=1 THEN 'DRAINLOW'
    WHEN TP1.DRAIN_TP1_FAIL=2 THEN 'DRAINHIGH'
    WHEN TP1.TP1_FAIL=1 THEN 'TP1LOW'
    WHEN TP1.TP1_FAIL=2 THEN 'TP1HIGH'
    WHEN TP2.TP2_FAIL=1 THEN 'TP2LOW'
    WHEN TP2.TP2_FAIL=2 THEN 'TP2HIGH'
    WHEN TP3.TP3_FAIL=1 THEN 'TP3LOW'
    WHEN TP3.TP3_FAIL=2 THEN 'TP3HIGH'
    WHEN TP4.TP4_FAIL=1 THEN 'TP4LOW'
    WHEN TP4.TP4_FAIL=2 THEN 'TP4HIGH'
    WHEN TP5.TP5_FAIL=1 THEN 'TP5LOW'
    WHEN TP5.TP5_FAIL=2 THEN 'TP5HIGH'
    WHEN TP6.TP6_FAIL=1 THEN 'TP6LOW'
    WHEN TP6.TP6_FAIL=2 THEN 'TP6HIGH'
    WHEN TP1.SOI_TP1_FAIL=1 THEN 'SOITP1LOW'
    WHEN TP1.SOI_TP1_FAIL=2 THEN 'SOITP1HIGH'
    WHEN TP1.EOI_TP1_FAIL=1 THEN 'EOITP1LOW'
    WHEN TP1.EOI_TP1_FAIL=2 THEN 'EOITP1HIGH'
    WHEN TP5.EOI_TP5_FAIL=1 THEN 'EOITP5LOW'
    WHEN TP5.EOI_TP5_FAIL=2 THEN 'EOITP5HIGH'
    WHEN TRACE.[TRIMCODE] ='InjFailed' THEN 'LEAKTEST' -- Combustion sel leakage
    ELSE 'ERROR'
    END
    )
    else cast (0 as varchar(1))
    end as REJECT_CAT

    , CASE
    WHEN TRACE.[TRIMCODE] like '%BadTst%' THEN 0
    WHEN TRACE.[TRIMCODE] like '%InjFail%' THEN 0
    WHEN TRACE.[TRIMCODE] like '%AbortCycl%' THEN 0
    WHEN TRACE.[TRIMCODE] IS NULL THEN 0
    WHEN TRACE.[TRIMCODE]='' THEN 0
    ELSE 1 end as TESTPASSED
    , TRACE.[TRIMCODE]
    ,0.50 AS S60LSL
    , ASY.[S60SHIMLOWSTROKE]
    ,0.54 AS S60USL
    , ASY.[S60SLEVESHIMM1]
    , ASY.[S60SLEVESHIMM2]
    , ASY.[S60SLEVESHIMM3]
    , ASY.[S60SHIMNO]
    ,2.91 AS S80LSL
    , ASY.[S80SPACESHIMM1]
    ,3.07 AS S80USL
    , ASY.[S80SPACESHIMM2]
    , ASY.[S80DISTANCE]
    , ASY.[S80SHIMNO]
    ,15.00 AS S97LSL
    , ASY.[S100STROKEATLOAD]/10 as S97STROKEATLOAD
    ,85.00 AS S97USL
    ,44.00 AS S100LSL
    , ASY.[S100FINALSTROKE]
    ,50.00 AS S100USL
    ,11.50 AS S110LSL
    , ASY.[S110AMP1]*10 as S110AMP1
    , ASY.[S110AMP2]*10 as S110AMP2
    ,15.40 AS S110USL
    ,TRACE.[NOZZLESN]
    ,TRACE.[NEEDLEBATCH]
    ,TRACE.[ARMPLUGBATCH]
    ,TRACE.[PVSEATBATCH]
    ,TRACE.[NEEDLESEALBATCH]
    ,TRACE.[BODYBATCH]
    ,TRACE.[CVRETAINERBATCH]
    ,TRACE.[ARMATUREBATCH]
    ,TRACE.[STATORSN]
    FROM
    [XPI_INJ_TRACE].[dbo].[T_INJ_TRACEABILITY] as TRACE
    ,
    [XPI_INJ_TRACE].[dbo].[T_EOL_TEST] as TST
    ,
    [XPI_INJ_TRACE].[dbo].[T_INJ_ASSEMBLY] as ASY
    ,
    [XPI_INJ_TRACE].[dbo].[T_EOL_TEST] as TEST
    --// TP1 FUELING & SOI & EOI
    ,(
    SELECT distinct
    [ID_TEST]

    ,15.60 AS TP1_LSL
    ,[RTMM3PERSTRK] as FUELING_TP1
    ,19.60 AS TP1_USL
    ,CASE
    WHEN ([RTMM3PERSTRK] <= 15.60 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([RTMM3PERSTRK] >= 19.60 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS TP1_FAIL

    ,0.00 AS SOI_TP1_LSL
    ,[SOIAVG] as SOI_TP1
    ,0.55 AS SOI_TP1_USL
    ,CASE
    WHEN ([SOIAVG] <= 0.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([SOIAVG] >= 0.55 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS SOI_TP1_FAIL

    ,0.00 AS EOI_TP1_LSL
    ,[EOIAVG] as EOI_TP1
    ,9999.00 AS EOI_TP1_USL
    ,CASE
    WHEN ([EOIAVG] <= 0.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([EOIAVG] >= 9999.00 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS EOI_TP1_FAIL

    ,2.50 AS DRAIN_TP1_LSL
    ,[DRAINMM3PERSTK] as DRAIN_TP1
    ,10.30 AS DRAIN_TP1_USL
    ,CASE
    WHEN ([DRAINMM3PERSTK] <= 2.50 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([DRAINMM3PERSTK] >= 10.30 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS DRAIN_TP1_FAIL

    ,[DURAVG] as DUR_TP1
    ,[SOISLOPE] as SOISLOPE_TP1
    ,[EOISLOPE] as EOISLOPE_TP1
    ,[AREAAVG] as AREA_TP1
    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    and
    [STEPTYPE] LIKE 'T1%'
    ) AS TP1
    --// TP2 FUELING
    ,(
    SELECT distinct
    [ID_TEST]
    ,3.18 AS TP2_LSL
    ,[RTMM3PERSTRK] as FUELING_TP2
    ,11.18 AS TP2_USL
    ,CASE
    WHEN ([RTMM3PERSTRK] <= 3.18 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([RTMM3PERSTRK] >= 11.18 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS TP2_FAIL
    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    and
    [STEPTYPE] LIKE 'T2%'
    ) AS TP2
    --// TP3 FUELING
    ,(
    SELECT distinct
    [ID_TEST]
    ,75.18 AS TP3_LSL
    ,[RTMM3PERSTRK] as FUELING_TP3
    ,97.18 AS TP3_USL
    ,CASE
    WHEN ([RTMM3PERSTRK] <= 75.18 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([RTMM3PERSTRK] >= 97.18 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS TP3_FAIL
    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    and
    [STEPTYPE] LIKE 'T3%'
    ) AS TP3
    --// TP4 FUELING
    ,(
    SELECT distinct
    [ID_TEST]
    ,244.17 AS TP4_LSL
    ,[RTMM3PERSTRK] as FUELING_TP4
    ,266.17 AS TP4_USL
    ,CASE
    WHEN ([RTMM3PERSTRK] <= 244.17 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([RTMM3PERSTRK] >= 266.17 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS TP4_FAIL

    ,[SOIAVG] as SOI_TP4
    ,[EOIAVG] as EOI_TP4

    ,[REACTORPRES] as REACTORPRESS_TP4
    ,[RT_FMTEMP] as RTFMTEMP_TP4

    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    and
    [STEPTYPE] LIKE 'T4%'
    ) AS TP4
    --// TP5 FUELING & EOI
    ,(
    SELECT distinct
    [ID_TEST]

    ,328.68 AS TP5_LSL
    ,[RTMM3PERSTRK] as FUELING_TP5
    ,364.68 AS TP5_USL
    ,CASE
    WHEN ([RTMM3PERSTRK] <= 328.68 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([RTMM3PERSTRK] >= 364.68 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS TP5_FAIL

    ,[DRAINMM3PERSTK] as DRAIN_TP5
    ,[SOIAVG] as SOI_TP5
    ,[DURAVG] as DUR_TP5
    ,[SOISLOPE] as SOISLOPE_TP5
    ,[EOISLOPE] as EOISLOPE_TP5
    ,[AREAAVG] as AREA_TP5

    ,[BACKPRES] as BACKPRESS_TP5
    ,[DRAINBKPRES] as DRAINBACKPRESS_TP5
    ,[REACTORPRES] as REACTORPRESS_TP5
    ,[RT_FMTEMP] as RTFMTEMP_TP5

    ,0.00 AS EOI_TP5_LSL
    ,[EOIAVG] as EOI_TP5
    ,9999.00 AS EOI_TP5_USL
    ,CASE
    WHEN ([EOIAVG] <= 0.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    WHEN ([EOIAVG] >= 9999.00 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    ELSE 0
    END AS EOI_TP5_FAIL

    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    and
    [STEPTYPE] LIKE 'T5%'
    ) AS TP5
    --// TP6 FUELING
    ,(
    SELECT distinct
    -9999.00 AS TP6_LSL
    --%TP6% ,[RTMM3PERSTRK] as FUELING_TP6
    ,0 as FUELING_TP6
    ,9999.00 AS TP6_USL
    --%TP6% ,CASE
    --%TP6% WHEN ([RTMM3PERSTRK] <= -9999.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    --%TP6% WHEN ([RTMM3PERSTRK] >= 9999.00 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    --%TP6% ELSE 0
    --%TP6% END AS TP6_FAIL
    ,0 as TP6_FAIL
    ,[ID_TEST]
    FROM
    [XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE
    [PARTNUMBER] = '2086663'
    --%TP6% and
    --%TP6% [STEPTYPE] LIKE 'T6%'
    AND
    [STEPTYPE] LIKE 'T5%'
    ) AS TP6
    WHERE
    TST.[DATE_TIME] >='2011-09-12 05:00'
    AND
    TST.[DATE_TIME] <'2011-09-13 23:59'
    AND
    TST.[PARTNUMBER]='2086663'
    AND
    TRACE.[ID_TEST] = TST.[ID_TEST]
    AND
    ASY.[ID_TEST] = TST.[ID_TEST]
    AND
    TEST.[ID_TEST] = TST.[ID_TEST]
    AND
    TP1.[ID_TEST] = TST.[ID_TEST]
    AND
    TP2.[ID_TEST]= TST.[ID_TEST]
    AND
    TP3.[ID_TEST] =TST.[ID_TEST]
    AND
    TP4.[ID_TEST]= TST.[ID_TEST]
    AND
    TP5.[ID_TEST]=TST.[ID_TEST]
    AND
    TP6.[ID_TEST]=TST.[ID_TEST]

    ORDER BY
    TST.[DATE_TIME]

    "

    Now, i need help debugging what the heck is wrong - if i put down part numbers it works for every part number except this new one.

    It crashes in an "Infinite Loop" sort of deal..

    Since you can see i am new at this, i would apreciate if you treat me such..

  2. #2
    Join Date
    Jun 2003
    Location
    Ohio
    Posts
    12,592
    Provided Answers: 1
    That may be a candidate for Crappiest SQL Code Of The Year award.
    Further proof that automated code generators suck at generating code.
    But there is no loop in that code, so you can't be hitting an infinite loop. I suspect that it is just slow as mole asses.
    Which was the part number you just added?
    If it's not practically useful, then it's practically useless.

    blindman
    www.chess.com: "sqlblindman"
    www.LobsterShot.blogspot.com

  3. #3
    Join Date
    Sep 2011
    Posts
    6

    Talking Reply to blindman

    Well,

    We certainly had a laugh here at the office, thanks for that!

    The guy who wrote it all has left us, and i've never used anything else SQL-wise then his queries - yet.

    [PARTNUMBER] = '2086663'

    Like stated above is the partnumber that crashes.

    Im trying to have a look through the files created for each part number if theres anything different regarding this specific one.

    / Fred

  4. #4
    Join Date
    Jun 2003
    Location
    Ohio
    Posts
    12,592
    Provided Answers: 1
    I see nothing particularly wrong with that subquery. On its own, it looks straightforward and should execute just fine. Try it:
    Code:
    SELECT	distinct
    		[ID_TEST]
    		,15.60 AS TP1_LSL
    		,[RTMM3PERSTRK] as FUELING_TP1
    		,19.60 AS TP1_USL
    		,CASE
    			WHEN ([RTMM3PERSTRK] <= 15.60 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    			WHEN ([RTMM3PERSTRK] >= 19.60 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    			ELSE 0
    			END AS TP1_FAIL
    		,0.00 AS SOI_TP1_LSL
    		,[SOIAVG] as SOI_TP1
    		,0.55 AS SOI_TP1_USL
    		,CASE
    			WHEN ([SOIAVG] <= 0.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    			WHEN ([SOIAVG] >= 0.55 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    			ELSE 0
    			END AS SOI_TP1_FAIL
    		,0.00 AS EOI_TP1_LSL
    		,[EOIAVG] as EOI_TP1
    		,9999.00 AS EOI_TP1_USL
    		,CASE
    			WHEN ([EOIAVG] <= 0.00 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    			WHEN ([EOIAVG] >= 9999.00 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    			ELSE 0
    			END AS EOI_TP1_FAIL
    		,2.50 AS DRAIN_TP1_LSL
    		,[DRAINMM3PERSTK] as DRAIN_TP1
    		,10.30 AS DRAIN_TP1_USL
    		,CASE
    			WHEN ([DRAINMM3PERSTK] <= 2.50 AND [PASSFAILMASK]>=1) THEN 1 -- LOW
    			WHEN ([DRAINMM3PERSTK] >= 10.30 AND [PASSFAILMASK]>=1) THEN 2 -- HIGH
    			ELSE 0
    			END AS DRAIN_TP1_FAIL
    		,[DURAVG] as DUR_TP1
    		,[SOISLOPE] as SOISLOPE_TP1
    		,[EOISLOPE] as EOISLOPE_TP1
    		,[AREAAVG] as AREA_TP1
    FROM	[XPI_INJ_TRACE].[dbo].[T_EOL_TSTDATA]
    WHERE	[PARTNUMBER] = '2086663'
    		and [STEPTYPE] LIKE 'T1%'
    The problem is that the SQL Server query engine will likely not be able to use any indexes on the tables within those subqueries. The cost of the query may increase exponentially as you add new product datasets.
    This whole thing should be rewritten using standard JOIN syntax.
    If it's not practically useful, then it's practically useless.

    blindman
    www.chess.com: "sqlblindman"
    www.LobsterShot.blogspot.com

  5. #5
    Join Date
    Sep 2011
    Posts
    6

    Thumbs up Reply to blindman

    Hey again,

    I tried the subquery - and it works just fine.

    I'm not quite sure what i need to do to fix this.

    / Fred

  6. #6
    Join Date
    Jun 2003
    Location
    Ohio
    Posts
    12,592
    Provided Answers: 1
    If this is automatically scripted code, that limits your options to what changes you can make to it, right?
    I'd create this as a stored procedure. From there, I'd clean it up to either eliminate the nested subqueries or break the statement into pieces and store data in temporary tables, consolidating it at the end.
    If it's not practically useful, then it's practically useless.

    blindman
    www.chess.com: "sqlblindman"
    www.LobsterShot.blogspot.com

  7. #7
    Join Date
    Sep 2011
    Posts
    6

    Reply to blindman

    Well it's not a fully automated script.

    I have control over the VBscript - that creates the SQL-question.

    Is there any good debugging tools that one could add on to let's say, Microsoft SQL Server Management Studio or something to troubleshoot where in the question a statement is missing/wrong ?

    Still thankful for any help i can get.

    / Fred

  8. #8
    Join Date
    Jun 2003
    Location
    Ohio
    Posts
    12,592
    Provided Answers: 1
    You can run the statement through the query tool and enable "show actual execution plan" to get some idea of where the bottleneck is.
    If it's not practically useful, then it's practically useless.

    blindman
    www.chess.com: "sqlblindman"
    www.LobsterShot.blogspot.com

  9. #9
    Join Date
    Sep 2011
    Posts
    6

    Reply to blindman

    Hmm,

    It says i need to be sysadmin

    / Fred

  10. #10
    Join Date
    Sep 2011
    Posts
    6

    Talking Solved it!

    Hey,

    I got rid of all ”distinct” statements and added [DATE_TIME] filters at the TP subqueries..

    This worked!

    Thanks for the help.

    / Fred

  11. #11
    Join Date
    Jun 2003
    Location
    Ohio
    Posts
    12,592
    Provided Answers: 1
    "distinct" is an expensive operation, but it is necessary if there are insufficient constraints on your data table or if your schema is not properly designed.
    If it's not practically useful, then it's practically useless.

    blindman
    www.chess.com: "sqlblindman"
    www.LobsterShot.blogspot.com

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •