Q&A

  • SQL문제입니다.(급해서리)....
재고관리하는 프로그램입니다.

MIINPT(입고데이타파일) ,MIHIST(재고데이타파일)이 있습니다.

[MIINPT] [MIHIST]

INPT_DATE HIST_DATE

INPT_ITEM HIST_ITEM

INPT_KUBUN HIST_KUBUN

. .

. .

. .

INPT_QTY(수량) HIST_IQTY(입고수량)

이렇게 정의되어 있습니다.

예를들면,

①번예제

INPT_DATE INPT_ITEM INPT_KUBUN ... INPT_QTY(수량)

20010724 AAAAAAA AF ... 400

②번예제

HIST_DATE HIST_ITEM HIST_KUBUN HIST_IQTY

20010724 AAAAAAA AF 500

전제조건이

INPT_DATE INPT_ITEM INPT_KUBUN 와

HIST_DATE HIST_ITEM HIST_KUBUN 이

같을시에만 가능합니다.

위의 ①과②의 예제를 보시면

①번 데이타를 삭제했을시 ②번 데이타의 HIST_IQTY의

수량에서 INPT_QTY의 수량값을 빼준값을 다시 HIST_IQTY에

MOVE시켜주는 겁니다.당연히 HIST_IQTY = 100 이 되겠죠..

그리고 INPT_QTY이 HIST_IQTY보다 클경우는 HIST_IQTY = 0

으로 해줘야 되는데 SQL문을 잘 몰라서 질문을 올립니다.

자세하게좀 설명좀 해주시면 감사하게씁니다.







3  COMMENTS
  • Profile
    송병철 2001.07.25 05:26
    급하시다고 하니 떱..



    xxx wrote:

    > 재고관리하는 프로그램입니다.

    > MIINPT(입고데이타파일) ,MIHIST(재고데이타파일)이 있습니다.

    > [MIINPT] [MIHIST]

    > INPT_DATE HIST_DATE

    > INPT_ITEM HIST_ITEM

    > INPT_KUBUN HIST_KUBUN

    > . .

    > . .

    > . .

    > INPT_QTY(수량) HIST_IQTY(입고수량)

    > 이렇게 정의되어 있습니다.

    > 예를들면,

    > ①번예제

    > INPT_DATE INPT_ITEM INPT_KUBUN ... INPT_QTY(수량)

    > 20010724 AAAAAAA AF ... 400

    > ②번예제

    > HIST_DATE HIST_ITEM HIST_KUBUN HIST_IQTY

    > 20010724 AAAAAAA AF 500

    > 전제조건이

    > INPT_DATE INPT_ITEM INPT_KUBUN 와

    > HIST_DATE HIST_ITEM HIST_KUBUN 이

    > 같을시에만 가능합니다.

    > 위의 ①과②의 예제를 보시면



    제일먼저 삭제할 데이타값을 변수에 미리 저장해야할것같네요

    var

    sINPT_DATE : STRING;

    iINPT_QTY,iHIST_IQTY : Integer;



    sINPT_DATE := 20010724;

    iINPT_QTY := 400;



    그다음 ②데이타의 양을 조회합니다.



    select HIST_IQTY

    from Table명

    where HIST_DATE = '20010724' <<- Primarry Key

    and <<- Key 가 여러개라면 Key 값을 잡으세요



    근다음 Select 한 HIST_IQTY 값을 변수에 저장



    iHIST_IQTY := FieldByName('HIST_IQTY').AsInteger;



    > ①번 데이타를 삭제했을시 <<-- DELETE FROM 테이블명 WHERE INPT_DATE = '20010724' 해서 1번의 해당 데이타를 삭제하시고

    그다음 2번 데이타를 UPDATE하시면 될것같습니다.





    ②번 데이타의 HIST_IQTY의

    > 수량에서 INPT_QTY의 수량값을 빼준값을 다시 HIST_IQTY에

    > MOVE시켜주는 겁니다. 그리고 INPT_QTY이 HIST_IQTY보다 클경우는 HIST_IQTY = 0

    > 으로 해줘야 되는데 <<- Sql.Add(' UPDATE TABLE명 ');

    //완전한 update문장을 실행하기전에 1번값과 2번값의 양을 비 교를 해야겠죠

    if iINPT_QTY > iHIST_IQTY then

    Sql.Add(' SET HIST_IQTY = 0 ')

    else

    Sql.Add(' SET HIST_IQTY = HIST_IQTY - :INPT_QTY');



    Sql.Add(' WHERE HIST_DATE = :INPT_DATE ');

    ParamByName(INPT_QTY).AsInteger := iINPT_QTY;

    ParamByName(INPT_DATE).AsString := sINPT_DATE;

    ExecSql;



    당연히 HIST_IQTY = 100 이 되겠죠..



    > SQL문을 잘 몰라서 질문을 올립니다.

    > 자세하게좀 설명좀 해주시면 감사하게씁니다.

    >



    그럼 즐코딩을 Have a NaicDay!

  • Profile
    xxx 2001.07.25 19:53
    여기서 변수 지정은 맨위에 따로 지정했습니다.

    알려주신데로 했는데 다시 한번 봐주십시요...



    procedure Tah5B00_f.DeleteBitBtnClick(Sender: TObject);

    begin

    if MessageDlg(' 재고(HISTORY)감안을 하시겠습니까.? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    begin

    try

    Query3.Close;

    Query3.SQL.Clear;

    Query3.SQL.Add(' select hist_iqty from mihist ');

    Query3.SQL.Add(' where hist_date = '''+s_date+''', hist_item = '''+s_item+''', ');

    Query3.SQL.Add(' hist_kubun = '''+s_kubun+''' ');

    Query3.ExecSQL;

    ihist_iqty := Query3.FieldByName('hist_iqty').AsInteger;



    Query3.Close;

    Query3.SQL.Clear;

    if iinpt_qty > ihist_iqty then

    Query3.SQL.Add(' update mihist set hist_iqty = 0 ')

    else

    Query3.SQL.Add(' set hist_iqty = hist_iqty - : inpt_qty ');

    Query3.SQL.Add(' where hist_date = inpt_date and hist_item = inpt_item and ');

    Query3.SQL.Add(' hist_kubun = inpt_kubun ');

    Query3.ExecSQL;

    s_Date := Query3.FieldByName('inpt_date').AsString;

    iinpt_qty := Query3.FieldByName('inpt_qty').AsInteger;

    except

    end;

    end;



    if MessageDlg(' 정말로 삭제 합니까.? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    begin

    try

    Query2.Close;

    Query2.SQL.Clear;

    Query2.SQL.Add(' delete from miinpt ');

    Query2.SQL.Add(' where inpt_date = '''+dateMEdit.Text+''' and inpt_time = '''+timeMEdit.Text+''' ');

    Query2.ExecSQL;

    StartBitBtnClick(self);

    MesgStatusBar.SimpleText := 'MESG:삭제를 완료 하였습니다.!!';

    except

    on E : EDBEngineError do

    if E.Errors[1].ErrorCode = 13059 then ShowMessage('기존에 삭제 되었습니다.!!')

    else showmessage('Oracle DB Error.!!')

    end;

    end;

    end;



  • Profile
    송병철 2001.07.25 23:41
    xxx wrote:

    > 여기서 변수 지정은 맨위에 따로 지정했습니다.

    > 알려주신데로 했는데 다시 한번 봐주십시요...

    >

    > procedure Tah5B00_f.DeleteBitBtnClick(Sender: TObject);

    > begin

    > if MessageDlg(' 재고(HISTORY)감안을 하시겠습니까.? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > begin

    > try

    > Query3.Close;

    > Query3.SQL.Clear;

    > Query3.SQL.Add(' select hist_iqty from mihist ');



    > Query3.SQL.Add(' where hist_date = '''+s_date+''', hist_item = '''+s_item+''', ');

    > Query3.SQL.Add(' hist_kubun = '''+s_kubun+''' ');



    <-- 위에 문장에서 and 가 빠졌내요 이렇게 고치세요

    Query3.SQL.Add(' where hist_date = '''+s_date +''' '

    + ' and hist_item = '''+s_item +''' '

    + ' and hist_kubun = '''+s_kubun+''' ');



    > Query3.ExecSQL; <<-- Select로 조회한 문장은 Open 입니다.

    Query3.Open;

    보통 Insert,Update,Delete인 문장은 ExecSql입니다.



    > ihist_iqty := Query3.FieldByName('hist_iqty').AsInteger;



    삭제를 하기전에 에디트에 있는 값을 변수에 저장을 하고나서



    iInpt_Qty := Inpt_QtyEdit.Text; //(삭제할 에디트값)

    s_Date := dateMEdit.Text;





    그다음 삭제를 합니다..



    > if MessageDlg(' 정말로 삭제 합니까.? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > begin

    > try

    > Query2.Close;

    > Query2.SQL.Clear;

    > Query2.SQL.Add(' delete from miinpt ');

    > Query2.SQL.Add(' where inpt_date = '''+dateMEdit.Text+''' and inpt_time = '''+timeMEdit.Text+''' ');

    > Query2.ExecSQL;

    > StartBitBtnClick(self);

    > MesgStatusBar.SimpleText := 'MESG:삭제를 완료 하였습니다.!!';

    > except

    > on E : EDBEngineError do

    > if E.Errors[1].ErrorCode = 13059 then ShowMessage('기존에 삭제 되었습니다.!!')

    > else showmessage('Oracle DB Error.!!')

    > end;

    > end;



    >

    > Query3.Close;

    > Query3.SQL.Clear;

    > if iinpt_qty > ihist_iqty then

    > Query3.SQL.Add(' update mihist set hist_iqty = 0 ')

    > else

    > Query3.SQL.Add(' set hist_iqty = hist_iqty - : inpt_qty '); <<-- 변수명을 같게 지정하세요 inpt_qty가아니라 앞에 iinpt_qty 이죠



    > Query3.SQL.Add(' where hist_date = inpt_date and hist_item = inpt_item and '); <<--파라미터를 쓸때는 이렇게 하세요

    Query3.SQL.Add(' where hist_date = :inpt_date '

    + ' and hist_item = :inpt_item '

    + ' and hist_kubun = :inpt_kubun');

    ParamByName('inpt_date').AsString := inpt_date ;

    ParamByName('inpt_item').AsString := inpt_item ;

    ParamByName('inpt_kubun').AsString := inpt_kubun;



    > Query3.ExecSQL;



    아래 부분의변수 값 지정은 잘못된것 같습니다. 위에 지정을 다시 합니다.



    > s_Date := Query3.FieldByName('inpt_date').AsString;

    > iinpt_qty := Query3.FieldByName('inpt_qty').AsInteger;

    > except

    > end;

    > end;

    >

    > end;

    >



    그럼 즐코딩을...........