none
referenze circolari RRS feed

  • Domanda

  • Salve a tutti,

    devo gestire su un db alcune operazioni che vengono svolte (tipo ciambelle metalliche).

    Il concetto è questo: un operaio segna cosa ha fatto e quanto ci ha messo (A).

    Se un sottoinsieme di A non va bene, lo segna in una tabella B.

    Il prossimo operaio che arriverà, prima di cominciare un nuovo lavoro, andrà a vedere cosa c'è su tabella B e provvederà a fare la stessa cosa che ha fatto il primo, cioè segnare cosa ha fatto e quanto ci ha messo.. e via così.

    Esempio: ho forato 10 ciambelle e poi ho controllato se hanno il buco conforme, quindi, segno sulla tabella A che ho forato e controllato 10 ciambelle mettendoci 10 minuti.

    Nel controllo tre di queste non hanno il buco. Quindi registro in B che 3 ciambelle andranno riforate.

    Riforo e ricontrollo e trovo 2 ciambelle ok e una con foro non conforme.

    Rimetto una ciambella in tabella B. Riforo e ricontrollo.. e tutto ok.

    Il programma deve memorizzare tutte le volte che ho controllato e forato i pezzi (cioè 14 volte)

    In pratica in tabella A metto ciò che ho fatto. Se un record di questi ha dei ricontrolli lo metto in B.

    Se ricontrollo qualcosa in B lo metto in A (che a sua volta potrebbe avere figli in B e cosi via).

    ho provato a fare uno schema e mi esce una tabella relazionata con un'altra tramite una referenza circolare. E’ corretto? O esiste alternativa?

     

    grazie

    venerdì 20 novembre 2015 14:00

Risposte

  • Ciao,

    La tabella dei task è unica e tale deve rimanere. E' sbagliato duplicarla per gestire delle revisioni.

    Se ci sono dei task che devono fare riferimento ai precedenti dovrai aggiungere un campo per fare riferimento al task padre in questo modo.

    CREATE TABLE dbo.Task (
    IDTask INT IDENTITY(1, 1)
    ,IDParentTask INT
    ,Codice varchar(10)
    ,IDOperatore INT
    ,TIME INT
    ,Qty INT
    ,Motivo VARCHAR(50)
    )

    L'aggiunta di un codice permette di identificare la partita di pezzi da lavorare.

    Un esempio di come potresti interrogare la tabella

    ;WITH cte
    AS (
    SELECT t.Codice AS cod
    ,t.qty
    FROM dbo.Task AS t
    WHERE IDParentTask IS NULL
    )
    SELECT codice
    ,cte.qty AS pezzi
    ,count(idtask) AS revisioni
    ,sum(dbo.task.qty) AS totlavorazioni
    FROM dbo.task
    INNER JOIN cte ON Codice = cte.cod
    GROUP BY codice
    ,cte.qty

    Risultato

    Codice pezzi revisioni totlavorazioni

    Blocco1 4 106 100
    Blocco2 1 110 110

    Saluti

    Daniele



    martedì 24 novembre 2015 11:35

Tutte le risposte

  • Scusa, ma ogni ciambella ha un ID univoco?Più in dettaglio, il ns fornaio fa 10 ciambelle... Sulla tabella A scrive 10 righe?

    Se la risposta è no, ripenserei alla risposta ;-)

    E se si, queste 10 righe sono univocamente identificate?

    Edit successivo: Pensavo a una cosa così:


    drop table tempdb.dbo.JobLogs
    go
    drop table tempdb.dbo.Ciambelle
    go
    create table tempdb.dbo.Ciambelle (
        pkCake int identity (1,1),
        myDesc varchar(255),
        primary key (pkCake))
    go
    create table tempdb.dbo.JobLogs (
        pkLog int identity (1,1),
        pkCake int,
        errStamp datetime,
        primary key (pkLog),
        foreign key (pkCake) references tempdb.dbo.Ciambelle(pkCake))

    delete tempdb.dbo.Ciambelle
    DBCC CHECKIDENT ('tempdb.dbo.Ciambelle', RESEED, 0)
    GO
    -- primo ciclo
    insert tempdb.dbo.Ciambelle values ('Prima'), ('Seconda'), ('Terza'), ('Quarta')
    insert tempdb.dbo.JobLogs (pkCake, errStamp) values (2, GETDATE()), (3, GETDATE())
    select * from tempdb.dbo.Ciambelle
    select * from tempdb.dbo.JobLogs

    -- secondo ciclo
    insert tempdb.dbo.JobLogs (pkCake, errStamp) values (3, GETDATE())

    -- performance
    select M.pkCake, isnull(S.TotErr,0) as TotErr
        from tempdb.dbo.Ciambelle M
            left outer join (select pkCake, COUNT(*) as TotErr from tempdb.dbo.JobLogs S group by pkCake) S on M.pkCake=S.pkCake

    • Modificato pgfiore venerdì 20 novembre 2015 16:27
    venerdì 20 novembre 2015 15:47
  • Ciao pgfiore,
    grazie per la risposta
    comunque:

    TABELLA A
    ID    NOME    TIME    QTY
    11    luca       10       100
    12    marco    12       110
    13    gianni    11       105


    TABELLA B
    ID    QTY    ID_TABELLA_A    MOTIVO
    50    3       11        RIFORARE
    51    2       11        LAVARE
    52    1       13        RIFORARE

    la tabella A mi serve per registrare tutte le operazioni che effettuo,
    la tabella B (quello che ho messo da parte in A) per vedere cosa devo fare quando inizio il turno.

    quindi avrò un id della tabella A relazionata 1:M sulla tabella B.
    Guarda il primo record (11). Ho lavorato 100pz, e di questi 100 ne ho messi
    3 a riforare (record 50) e altri 2 di questi 100 a lavare perché sporchi (record 51).

    Ma quando lavoro i 3 pezzi della tabella B, che vedi nel primo record (50)
    dovrò andare a segnare questo lavoro nella tabella A
    E' questo ciclo che non riesco a gestire.
    Vorrei capire come creare le tabelle per far ciò

    grazie


    venerdì 20 novembre 2015 17:25
  • ma l'id della tabella A cosa identifica ?

    il pezzo ?

    l'operaio ?

    e se è il pezzo, cosa rappresenta quantity ?

    e l'id della tabella B cosa identifica ?

    il pezzo ?

    ed anche qui cosa rappresenta quantity ?

    'sta roba mi sembra progettata in maniera sbagliata...


    Edoardo Benussi
    Microsoft MVP - Enterprise Mobility
    edo[at]mvps[dot]org


    sabato 21 novembre 2015 16:38
    Moderatore
  • ma l'id della tabella A cosa identifica ?

    >> il suo incremento quando inserisco il lavoro fatto

    il pezzo ?

    l'operaio ?

    e se è il pezzo, cosa rappresenta quantity ?

    e l'id della tabella B cosa identifica ?

    >> il suo incremento quando inserisco il lavoro da fare, con FK alla tabella A

    il pezzo ?

    ed anche qui cosa rappresenta quantity ?

    >> quelli che sono da rifare

    'sta roba mi sembra progettata in maniera sbagliata...


    Edoardo Benussi
    Microsoft MVP - Enterprise Mobility
    edo[at]mvps[dot]org



    Ciao Edoardo.. sicuramente potrebbe anche essere sbagliata. Per questo sono qui. Per capire dove sbaglio..

    L'obiettivo è questo. Cambio esempio.

    Lavo tappeti.

    Prendo 10 tappeti e li lavo. Li controllo e vedo che 3 sono sporchi.

    Quindi mando a riciclo 3 tappeti (di quei 10) che ho già lavato una volta.

    Li lavo, li controllo e vedo che 1 è ancora sporco. Quindi lo rimando a riciclo. Lo controllo ed è pulito.

    Io voglio sapere da dove arrivano i 3 tappeti (e poi qulell'1) e voglio tener traccia di tutte le volte che li lavo e rilavo.

    Quindi nella tabella A segno che Luca ha lavato 10 tappeti in 10 minuti.

    Se trova tappeti sporchi li mette in Tabella B, dicendo che sono 3 legati al record della tabella A dove ho messo i 10.

    E via così..

    Se no, l'alternativa?

    Grazie mille per il supporto


    • Modificato duppino domenica 22 novembre 2015 11:43
    domenica 22 novembre 2015 11:42
  • La tua tabella A (I.e. Operai) non ti aiuta, è fuori conteso. Devi dare un "nome" a ogni pezzo che lavori altrimenti non riesci a tracciarne la vita. In lavanderia ti attaccano un barcode sul tappeto, vero? Riguarda la mia tabella Ciambelle; una e solo una Ciambella avrá uno specifico id per tutta la vita del progetto.
    • Modificato pgfiore domenica 22 novembre 2015 12:39
    domenica 22 novembre 2015 12:38
  • Grazie pgfiore,

    io ho fatto esempi per capire. In realtà questo potrebbe essere applicato ad una fabbrica di fiammiferi

    dove se il fiammifero non accende, occorre mettere più zolfo e così via.

    Dare un id ad ogni fiammifero non la vedo una soluzione.

    A me basta lavorare sui gruppi di quantità.

    Cioè, lavoro 100 e metto 10 da parte.. di questi 10, 3 da parte, di questi 3 (se tutto ok) nessuno.

    Mi basta sulle quantità, perchè sono quelle che vado a vedere quando occorre metterli in bolla.. cioè sapere quanti ce n'è disponibili..

    che dici?

    domenica 22 novembre 2015 13:02
  • ok, dalle tue spiegazioni ora le cose si delineano meglio.

    domande:

    stabilito che gli id delle due tabelle sono puramente indici di posizione

    si può dire che l'id della tabella A rimane associato sempre allo stesso operaio ?

    perchè nella tabella B hai il riferimento all'id della tabella A ?

    che cosa fa modificare i dati della tabella B ? e anche della tabella A ? 

    in pratica quale codice usi ?


    Edoardo Benussi
    Microsoft MVP - Enterprise Mobility
    edo[at]mvps[dot]org


    lunedì 23 novembre 2015 09:15
    Moderatore
  • Non è che ti salvi cambiando esempio; qualunque cosa tu voglia tracciare ti serve un identificativo a quel livello.

    D'altra parte sei tu che hai affermato che la tua soluzione non funziona! ;)

    Se ti basta tracciare i gruppi allora potresti provare con una catena padre-figlio, dove ogni volta che hai errori l'insieme lo chiami "lotto" e lo identifichi.

    Quindi nell'esempio dei fiammiferi, alla fine, avresti 2 lotti: ID1 da 10 pezzi e ID2 da 3 pezzi.

    Però ti tocca memorizzare il rapporto e scorrerlo tutta per sapere com'è andata... Versione brutta: sul record stesso del primo lotto, ID1 (10 pezzi) devi memorizzare anche ID2 (dei 3 pezzi) quando questo si crea (con un'update). versione un po' meglio ;) una terza tabella per la sola relazione alla quale aggiungi record via via che crei lotti di "recupero"

    lunedì 23 novembre 2015 09:22
  • Ciao Edoardo,

    prima domanda SI. Ogni operaio, una volta fatto il lavoro, segna quanto ha fatto.

    Seconda domanda. Perché voglio sapere se, di una qtà fatta, ho dei pezzi da rifare e quindi risalire al record iniziale.

    Terza domanda. I dati rimangono lì. li cambio con un update a livello di codice nel caso l'operatore abbia sbagliato a digitare le qtà o i tempi.

    Comunque l'obiettivo è questo. Segnare il fatto e relativi ricicli, che potrebbero esserci come no.

    Quindi, io ho fatto 100 pezzi e sono tutti ok.

    Oppure ho fatto 100 pezzi, e ho trovato 10 da rilavorare. Una volta ricontrollati di questi 10 ne trovo 3 da rilavorare. Una volta rcontrollati non trovo più nulla.

    Risultato: sapere quante volte ho controllato i pezzi per farmi pagare il lavoro.

    Grazie

    martedì 24 novembre 2015 10:04
  • Ciao Edoardo,

    prima domanda SI. Ogni operaio, una volta fatto il lavoro, segna quanto ha fatto.

    Seconda domanda. Perché voglio sapere se, di una qtà fatta, ho dei pezzi da rifare e quindi risalire al record iniziale.

    Terza domanda. I dati rimangono lì. li cambio con un update a livello di codice nel caso l'operatore abbia sbagliato a digitare le qtà o i tempi.

    Comunque l'obiettivo è questo. Segnare il fatto e relativi ricicli, che potrebbero esserci come no.

    Quindi, io ho fatto 100 pezzi e sono tutti ok.

    Oppure ho fatto 100 pezzi, e ho trovato 10 da rilavorare. Una volta ricontrollati di questi 10 ne trovo 3 da rilavorare. Una volta rcontrollati non trovo più nulla.

    Risultato: sapere quante volte ho controllato i pezzi per farmi pagare il lavoro.

    Grazie

    Potrebbe bastare una sola tabella:

    TABELLA LAVORI:    (ID_LAVORATORE, ID_GRUPPO, TOTALE_PEZZI, PEZZI_DA_RIFARE)

    Esempio:

    LAVORI:
    a      1     100     10
    b      2       50       0
    c       1      10        3
    a      1        3        0

    martedì 24 novembre 2015 10:44
  • Ciao,

    La tabella dei task è unica e tale deve rimanere. E' sbagliato duplicarla per gestire delle revisioni.

    Se ci sono dei task che devono fare riferimento ai precedenti dovrai aggiungere un campo per fare riferimento al task padre in questo modo.

    CREATE TABLE dbo.Task (
    IDTask INT IDENTITY(1, 1)
    ,IDParentTask INT
    ,Codice varchar(10)
    ,IDOperatore INT
    ,TIME INT
    ,Qty INT
    ,Motivo VARCHAR(50)
    )

    L'aggiunta di un codice permette di identificare la partita di pezzi da lavorare.

    Un esempio di come potresti interrogare la tabella

    ;WITH cte
    AS (
    SELECT t.Codice AS cod
    ,t.qty
    FROM dbo.Task AS t
    WHERE IDParentTask IS NULL
    )
    SELECT codice
    ,cte.qty AS pezzi
    ,count(idtask) AS revisioni
    ,sum(dbo.task.qty) AS totlavorazioni
    FROM dbo.task
    INNER JOIN cte ON Codice = cte.cod
    GROUP BY codice
    ,cte.qty

    Risultato

    Codice pezzi revisioni totlavorazioni

    Blocco1 4 106 100
    Blocco2 1 110 110

    Saluti

    Daniele



    martedì 24 novembre 2015 11:35