3 votes

Comment puis-je créer des enregistrements en double basés sur la valeur d'une autre table ?

J'ai deux tables dans ma base de données, Work_Order qui est la table source dans laquelle sont stockées les informations sur les bons de travail. Work_Schedule qui contient les programmes de travail qui indiquent aux personnes de l'atelier de production ce qu'il faut construire, quand et en quelle quantité.

La table Work_Order ressemble à

Work order  ItemCode    Size          Qty    Qty_per_HR 
41051        600111    14L-16.1        55          10

Je veux dupliquer la ligne du bon de travail ci-dessus dans le tableau des bons de travail ci-dessus en fonction de la Qté par heure et créer automatiquement un planificateur de travail comme indiqué ci-dessous.

donde TARGET = Work_Order.Qty/Work_Order.Qty_per_HR

Tableau des horaires de travail

Id      Start Date/Time        End Date/Time       Work Order       Work Center     TARGET   ACTUAL
1001    2019-07-22 7:00AM      2019-07-22 8:00AM       41051             1         10       
1001    2019-07-22 8:00AM      2019-07-22 9:00AM       41051             1         10    
1001    2019-07-22 9:00AM      2019-07-22 10:00AM      41051             1         10    
1001    22019-07-22 10:15AM    2019-07-22 11:00AM      41051             1         10    
1001    22019-07-22 11:00AM    2019-07-22 12:00PM      41051             1         10  
1001    2019-07-22 1:30PM      2019-07-22 2:30PM       41051             1         5      

J'ai l'intention d'utiliser AfterInsert déclencher dès que l'utilisateur un bon de travail créer les doublons.

Fenêtres d'horaires

enter image description here

2voto

Gordon Linoff Points 213350

Cela semble naturel pour un CTE récursif :

with cte as (
      select convert(datetime, '2019-07-22 7:00AM') as dt, workorder, 1 as workcenter, qtyperh as target,
             itemcode, size, (qty - qtyperh) as qty, qtyperh
      from t
      union all
      select dateadd(hour, 1, dt), workorder, workcenter,
             (case when qty > qtyperh then qtyperh else qty end) as target,
             itemcode, size, (qty - qtyperh), qtyperh
      from cte
      where qty > 0
     )
select cte.*,
       dateadd(second, 60 * 60 * target / qtyperh, dt) as end_dt
from cte
order by workorder, dt;

Aquí est un db<>fiddle.

1voto

Sami Points 7214

C'est ce que vous cherchez ?

CREATE TABLE T(
  WorkOrder INT,
  ItemCode INT,
  Size VARCHAR(25),
  Qty INT,
  QtyPerH INT
);

INSERT INTO T VALUES
(41051,        600111,    '14L-16.1',        55,          10),
(41052,        600112,    '14L-16.2',        55,          5);

SELECT T.*
FROM T CROSS APPLY
(
  SELECT 1 N
  FROM master..spt_values
  WHERE [Type] = 'P'
        AND
        [Number] < (T.Qty / T.QtyPerH)
) TT;

Les retours :

+-----------+----------+----------+-----+---------+
| WorkOrder | ItemCode |   Size   | Qty | QtyPerH |
+-----------+----------+----------+-----+---------+
|     41051 |   600111 | 14L-16.1 |  55 |      10 |
|     41051 |   600111 | 14L-16.1 |  55 |      10 |
|     41051 |   600111 | 14L-16.1 |  55 |      10 |
|     41051 |   600111 | 14L-16.1 |  55 |      10 |
|     41051 |   600111 | 14L-16.1 |  55 |      10 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
|     41052 |   600112 | 14L-16.2 |  55 |       5 |
+-----------+----------+----------+-----+---------+

Démo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X