답변 주신분들 감사합니다.
그런데 끝내는 dbExpress의 프로시저는 하지 못하고 ado로 하니까 쉽게 연결되네요
원하는 데이타값을 output으로 하여 A_Data변수에 들어 올립니다.(소스1입니다)
감사합나다.
덤으로 하나더 프로시저로 실행하여 그리드에 삽입합니다.
참고하세요
연결하기
SqlQuery --->SqlConnection에 SqlConnection이름
DatasetProvider--->datasetdp sqlQuery이름
Clientdataset--->ProviderName에 DatasetProvider의 이름
Datasource--->Dataset에 Clientdataset의 이름
grid--->Datasource에 Datasource의 이름을 입력한다.
아래와 같이 소스를 입력한다.
끝
소스2입니다.
Qty:= ' Exec sp_er_AcceptList ';
Qty:=Qty+' '''+ A_Sday +''', '; //,로 꼭 데이타 아그먼트를 분리하여 준다. 다알죠
Qty:=Qty+' '''+ A_Eday +''' ';
Q_DaT00.Close;
With Q_Dat00 Do begin
Close;
End;
With Q_Pan00 Do begin
DisableControls;
Close ;
Sql.Clear ;
Sql.Text:=Qty ;
End;
With Q_Dat00 Do begin
Try Open;
Finally EnableControls;
End;
End;
소스1입니다.
With P_a_DataF.StoredProc do Begin
Close;
Parameters.Clear;
ProcedureName := 'sp_er_AcceptNo ' ;
Parameters.CreateParameter('AcceptDate' ,ftString,pdinput, 10, A_Bulu );
Parameters.CreateParameter('AcceptGubun',ftString,Pdinput, 1, 'E' );
Parameters.CreateParameter('AcceptSeq' ,ftString,Pdoutput, 5, '' );
Open;
A_Data:=Parameters.ParamValues['AcceptSeq'];
End;
박지훈.임프 님 감사합니다.
?????????????????????????????????????????????????????????????????????????????????????????????????
임기섭 님이 쓰신 글 :
: 박지훈.임프 님의 버젼과 같습니다.
: 델 7이고요
: 업데이트도 했고요
: 답변 감사합니다.
: 혹시 SQLStoredProc1프로퍼티에서 프로시저명과 다른 프로퍼티를 수정한곳이 있나요
: 다시 한번 답변을 부탁드리고 좋은 일만 있기를 바랍니다.
: 그럼 안녕히 계세요
:
: 박지훈.임프 님이 쓰신 글 :
: : 사용하시는 델파이의 버전과 업데이트 상태를 확인해보세요.
: : MS SQL서버용 dbExpress 드라이버는 델파이7부터 지원되기 시작했는데, 제가 테스트한 것은 델파이7이며
: : 업데이트 1이 적용된 상태입니다. 업데이트1도 한번 수정된 버전이 나왔는데 그 새 버전이구요.
: :
: : 확인하시려면 델파이의 bin 디렉토리의 dbexpmss.dll 파일의 등록정보를 보세요.
: : 델파이7 버전인 경우 파일 버전 7.1.1523.17956, 날짜가 2004년 2월 28일입니다.
: : 델파이2005 버전의 경우 파일 버전은 9.0.1882.30496, 날짜는 2005년 3월 5일입니다.
: :
: : 그럼...
: :
: :
: : 임기섭 님이 쓰신 글 :
: : : 다시 질문드립니다.
: : : 쿼리분석기에서 프로스저를 생성하고 문장으로 쿼리를 만든후 테스트를 해보았습니다.
: : : 그런데 저는 왜 에라가 나는지 모르겠습니다.
: : :
: : : SQLStoredProc1프로퍼티에서는 이외에는 수정하지 않았습니다.
: : :
: : : SQLStoredProc1.SQLConnection :=P_a_DataF.ALL_Connection;
: : : SQLStoredProc1.StoredProcName:='sp_er_Test';
: : :
: : : with SQLStoredProc1 do begin
: : : ParamByName('memid').AsString:='20060221';
: : : ExecProc;
: : : Showmessage(ParamByName('outmemid').AsString);
: : : end;
: : : 위 소스를 실행해본 결과 SQLStoredProc1 parameter @memid not found 에러 입니다.
: : : 어찌 되느일인지요
: : : 분명히 쿼리문에 가서 보면 sp_er_Test프로시저는 존재합니다.
: : : 그리고 exec sp_er_Test '20060201',' ' 하면 정상입니다.
: : : 좀 부탁드리겠습니다.
: : : 다시한번 흔쾐한 답변 부탁합니다.
: : :
: : :
: : : 박지훈.임프 님이 쓰신 글 :
: : : : MS SQL서버에서 간단한 샘플을 만들어서 해봤습니다.
: : : :
: : : : 스토어드 프로시저는 다음과 같습니다.
: : : : CREATE proc ImpTest
: : : : @memid char(10),
: : : : @outmemid char(10) output
: : : : as
: : : : begin
: : : : set @outmemid =SUBSTRING(@memid, 1, 2)
: : : : end
: : : : GO
: : : :
: : : : 그리고 SQLStoredProc 컴포넌트를 실행하는 코드는 다음과 같습니다.
: : : : procedure TForm1.Button1Click(Sender: TObject);
: : : : begin
: : : : with SQLStoredProc1 do
: : : : begin
: : : : ParamByName('@memid').AsString:='20060221';
: : : : ExecProc;
: : : : Caption := ParamByName('@outmemid').AsString;
: : : : end;
: : : : end;
: : : :
: : : : 결론은, 잘 됩니다. ^^
: : : : 스토어드 프로시저의 이름을 넣은 직후에 Params에는 실제 필요한 파라미터들이 자동으로 채워집니다.
: : : : 따라서 CreateParam()를 호출하면 필요없는 파라미터가 추가로 더 생성되게 됩니다.
: : : : 결국 Index out of bounds 에러가 발생할 수밖에 없군요.
: : : :
: : : : 그럼...
: : : :
: : : :
: : : : 임기섭 님이 쓰신 글 :
: : : : : 답변감사합니다.
: : : : : 앞으로 답변을 여러종류의 답변을 하지 않는것으로 하겠습니다.
: : : : : 죄송합니니다.
: : : : :
: : : : : 1번째 답변은 params.creater는 삭제나 추가하나 에라 답변은 똑같습니다.
: : : : : list index out of bound에라입니다.
: : : : : 아마 그것 문장과는 상관이 없는것 같습니다.
: : : : : 참 주위의 지인들에게 답변을 얻은봐 델파이 dbexpress버그라 합니다. 다른 관련Db는 잘 되다 합니다. 또 상용버젼 DbExpress버젼은 아무 이상이 없답니다.
: : : : : 고맙습니다.,
: : : : :
: : : : :
: : : : : 박지훈.임프 님이 쓰신 글 :
: : : : : : 질문은 한번에 하나씩 해주시면 좋겠네요. 보통 답변을 쓰시는 분들은 남는 시간에 소일거리삼아 하는데...
: : : : : : 여러개가 엮여 있으면 일단 내용을 보기 전부터 모양새가 부담스러워서 그냥 넘어가기 쉽답니다. ^^
: : : : : :
: : : : : : 첫번째 질문은...
: : : : : : 다른 부분은 별 문제가 없는 거 같은데, Params.Create; 부분이 수상합니다.
: : : : : : Params는 TSQLQuery나 TSQLStoredProc 컴포넌트가 이미 기본적으로 생성시켜놓은 상태이므로 생성자를 여기서
: : : : : : 호출할 이유가 없겠고, 게다가 여기서 생성자를 호출하면 예상치못한 희한한 에러가 발생할 수 있습니다.
: : : : : :
: : : : : : 아마도 TSQLStoredProc에서 읽으려고 하는 Params 대신 허공을 떠도는 처녀귀신 Params 객체가 만들어지고 거기에
: : : : : : 파라미터가 생성될 겁니다. 그러니 TSQLStoredProc에는 파라미터가 하나도 안들어가있는 상태가 될 듯.
: : : : : : index out of bounds 예외가 발생한 것은 그 때문인 것 같습니다.
: : : : : : 그러니 해결책은, Params.Create; 라인만 지워버리면 될 듯.
: : : : : :
: : : : : : 두번째 질문은...
: : : : : : P_a_DataF.Q1이 아마도 TSQLQuery인가본데요. TSQLQuery와 같은 쿼리 전용 컴포넌트에서는 스토어드 프로시저를
: : : : : : 실행할 수는 있어도 출력 파라미터 값을 받아올 수는 없습니다. 그렇기 때문에 TSQLStoredProc 같은 스토어드 프로시저
: : : : : : 전용 컴포넌트가 필요한 거죠.
: : : : : :
: : : : : : 그럼...
: : : : : :
: : : : : :
: : : : : : 궁금이 님이 쓰신 글 :
: : : : : : : 델7입니다.
: : : : : : : 디비는 mssql
: : : : : : : 컴포넌트는 DbExPress입니다.
: : : : : : : AcceptDate와 AcceptGubun은 input변수이고
: : : : : : : AcceptSeq는 output데이터 입니다.
: : : : : : :
: : : : : : : 질문1
: : : : : : : 그런데 소스1를 보면 params.count보면 3이 제대로 나오는데 왜 list indexout of bounds인지요
: : : : : : :
: : : : : : : 질문2
: : : : : : : 그런데 소스2를 보면 Query를 이용하여 프로시저를 사용하는데 에라는 없는데 왜
: : : : : : : AcceptSeq의 변수에 값이 안넘어 올까요 궁금합니다.
: : : : : : : 쿼리분석기에서
: : : : : : : exec sp_er_acceptNo '20060222','E',''
: : : : : : : 실행하면 값을 가져옵니다 00008이런식으로
: : : : : : :
: : : : : : : 그럼 수고하세요
: : : : : : :
: : : : : : : 소소1
: : : : : : : With SQLStoredProc1 Do begin
: : : : : : : Close;
: : : : : : : StoredProcName:='sp_er_AcceptNo';
: : : : : : : Params.Create;
: : : : : : : params.CreateParam(FtString ,'AcceptDate' , ptInput ).AsString:='20060221';
: : : : : : : params.CreateParam(FtString ,'AcceptGubun', ptInput ).AsString:='E' ;
: : : : : : : params.CreateParam(FtString ,'AcceptSeq' , ptOutput).AsString:=Acc_Code;
: : : : : : : ExecProc; //여기에서 에라입니다. List index out of bounds에라입니다.
: : : : : : : End;
: : : : : : :
: : : : : : : 소소2
: : : : : : : With P_a_DataF.Q1 do begin
: : : : : : : Close;
: : : : : : : SQL.Clear;
: : : : : : : SQL.Add('Exec sp_er_AcceptNo :Date, :Gubun,:Seq ');
: : : : : : : ParamByName('Date' ).AsString:='20060221';
: : : : : : : ParamByName('Gubun').AsString:='E' ;
: : : : : : : ParamByName('Seq' ).AsString:='' ;
: : : : : : : Try
: : : : : : : ExecSQL;
: : : : : : : Except
: : : : : : : on E: EDBEngineError do begin
: : : : : : : ShowMessage(IntToStr((E as EDBEngineError).Errors[0].ErrorCode)+':'+E.Message);
: : : : : : : Exit;
: : : : : : : end;
: : : : : : : End;
: : : : : : : End;
|