unit u_op_seae_edi_yd; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, BusinessSkinForm, StdCtrls, bsSkinCtrls,inifiles, DB, ADODB; type Tfrm_op_seae_edi_yd = class(TForm) bsBusinessSkinForm1: TbsBusinessSkinForm; Label2: TLabel; Edit2: TEdit; Edit1: TEdit; Label1: TLabel; SaveDialog1: TSaveDialog; bsSkinButton1: TbsSkinButton; bsSkinButton2: TbsSkinButton; Label3: TLabel; Label4: TLabel; Edit3: TEdit; Edit4: TEdit; bsck: TCheckBox; procedure bsSkinButton2Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure bsSkinButton1Click(Sender: TObject); private function FormatListString(Old:TStrings;mCount,Strlength:integer):String; function FormatEdiString(str:String;Strlength:integer=0):String; function GetLengthword(var s: String; l: Integer;str:String): String; procedure GetLengthTString(var sl:TStringList;l:integer); function GetCntrEdi(cntrsize: String):String; function GetLoadPortEdiID(Port:String): String; function GetCtnCode(ctnkind,ctnsize:String):String; { Private declarations } public { Public declarations } end; var frm_op_seae_edi_yd: Tfrm_op_seae_edi_yd; implementation uses u_op_seae, u_main, my_sys_function, u_data_share, u_op_seae_assistant; {$R *.dfm} function Tfrm_op_seae_edi_yd.GetLoadPortEdiID(Port:String): String; var aQuery:TADOQuery; begin aQuery:=CreateAdoQuery; try with aQuery do begin Close;SQL.Clear; SQL.Add('Select EDI代码 from t_code_loaport where 英文名='''+Port+''''); Open; if not IsEmpty then Result:=Trim(FieldByName('EDI代码').asstring) else Result:=''; end; finally FreeAndNil(aQuery); end; end; function Tfrm_op_seae_edi_yd.GetCtnCode(ctnkind,ctnsize:String): String; var aQuery:TADOQuery; begin aQuery:=CreateAdoQuery; ctnsize:=StringReplace(ctnsize,'''','''''',[rfReplaceAll]); try with aQuery do begin Close;SQL.Clear; SQL.Add('Select EDI代码 from t_code_ctn where 箱型='''+ctnkind+''' and 尺寸='''+ctnsize+''''); Open; if not IsEmpty then Result:=Trim(FieldByName('EDI代码').asstring) else Result:=''; end; finally FreeAndNil(aQuery); end; end; function Tfrm_op_seae_edi_yd.GetLengthword(var s: String; l: Integer;str:String): String; var i:Integer; b:Boolean; begin s:=''; if Length(str)<=l then begin result:=str; end else begin b:=true; s:=Copy(str,l+1,Length(str)-l); str:=Copy(str,1,l); result:=''; for i:=Length(str) downto 1 do begin if ( not (str[i] in [' ',';',',','.',':','/','(',')','?','+','-'])) and b then s:=str[i]+s else begin b:=false; result:=str[i]+Result; end; end; s:=s+' '; end; end; procedure Tfrm_op_seae_edi_yd.GetLengthTString(var sl: TStringList; l: integer); var i:integer; str_head,S:String; Stemp:TStrings; begin Stemp:=TStringList.Create; try str_head:=''; S:=''; for i:=0 to sl.Count-1 do begin if sl[i]<>'' then stemp.add(GetLengthword(str_head,l,s+sl[i])); S:=Str_head; end; while S<>'' do begin stemp.add(GetLengthword(str_head,l,s)); S:=Str_head; end; SL.Assign(Stemp); finally FreeAndNil(Stemp); end; end; function Tfrm_op_seae_edi_yd.FormatEdiString(str:String;Strlength:integer=0):String; var i:integer; strC:widestring; begin strC:=''; for i:=1 to length(str) do begin if ((str[i]=#39) or (str[i]=':') or (str[i]='+') or (str[i]='?') or (str[i]=';')) then begin strC:=strC+'?'+str[i]; end else begin strC:=strC+str[i]; end; end; result:=strC; end; function Tfrm_op_seae_edi_yd.FormatListString(Old:TStrings;mCount,Strlength:integer):String; var i:integer; NewStrs:TStrings; mStr:String; begin Result:=''; NewStrs:=TStringList.Create; for i:=0 to old.Count-1 do begin if Length(old.Strings[i])<=Strlength then begin NewStrs.Add(old.Strings[i]); end else begin mStr:=old.Strings[i]; while length(mStr)>Strlength do begin newStrs.Add(copy(mStr,1,Strlength)); system.Delete(mStr,1,Strlength); end; newStrs.Add(mStr); end; end; try for i:=0 to mCount-1 do begin if i'' then sl.Add(sl1.Strings[L]); end; M:=1; for L:=0 to sl.Count-1 do begin if M<=5 then begin if M=1 then begin s:='47:'+FormatEdiString(sl.Strings[L],0)+':'; end else begin if M=5 then s:=s+FormatEdiString(sl.Strings[L],0) else s:=s+FormatEdiString(sl.Strings[L],0)+':'; end; end else begin S:=S+''''; Str.Add(S); M:=1; s:='47:'+FormatEdiString(sl.Strings[L],0)+':'; end; M:=M+1; end; S:=S+''''; Str.Add(S); Count:=Count+11; strRmain:=''; try rs:=Tadoquery.Create(application); rs.Connection := frm_main.db; strsql:='select * from t_op_ctn where 编号=' +#39+frm_op_seae.t_op_seae.fieldbyname('编号').asstring+#39; rs.Close; rs.sql.clear; rs.sql.add(strsql); rs.Open; if not rs.IsEmpty then begin rs.First; while not rs.Eof do begin if rs.fieldbyname('备注').asstring='' then strtemp:='F' else strtemp:=copy(rs.fieldbyname('备注').asstring,1,1); str.Add ('51:001:'+trim(rs.fieldbyname('箱号').asstring)+':'+trim(rs.fieldbyname('封号').asstring)+':'+GetCtnCode(rs.fieldbyname('箱型').asstring,rs.fieldbyname('尺寸').asstring)+':'+strtemp+':' +trim(IntToStr(rs.fieldbyname('件数').AsInteger))+':'+trim(FloatToStr(rs.fieldbyname('重量').AsFloat))+':'+'''' ); rs.Next; end; end; rs.Close; rs.Destroy; except on e:exception do begin rs.Close; rs.Destroy; exit; end; end; count:=str.count; str.Add ('99:'+ inttostr(count+1)+#39); end else begin str:=Tstringlist.Create; str.Clear; str.Add('00:IFCSUM:MANIFEST:'+trim(strType)+':'+ SenderCode+':'+ ReciverCode +':'+FormatDateTime('YYMMDDHHMM', Now)+#39); str.Add('10::' + trim(frm_op_seae.t_op_seae.fieldbyname('船名').asstring) +':' +trim(frm_op_seae.t_op_seae.fieldbyname('航次').asstring) + '::::' + FormatDateTime('YYYYMMDD',frm_op_seae.t_op_seae.fieldbyname('开船日期').asdatetime)+':' +trim(edit4.Text)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('装货港').asstring) +#39); //船舶经营人 str.Add('11:' +'SOF'+':' +trim(frm_op_seae.t_op_seae.fieldbyname('船公司').asstring) +#39); //船舶经营人 Count:=0; for k:=0 to frm_op_seae.dxdbgrid1.SelectedCount-1 do begin frm_op_seae.t_op_seae.GotoBookmark(pointer(frm_op_seae.dxdbgrid1.selectedrows[k])); { str.Add('11::' + trim(frm_op_seae.t_op_seae.fieldbyname('船名').asstring) +':' + 'V.'+trim(frm_op_seae.t_op_seae.fieldbyname('航次').asstring) + '::::::::::' +#39); //船舶经营人 } if frm_data_share.t_code_free.locate('代码',frm_op_seae.t_op_seae.fieldbyname('付费方式').asstring,[]) then begin strtemp:=copy(frm_data_share.t_code_free.fieldbyname('代码').asstring,1,1); end else begin strtemp:='P'; end; if not bsck.Checked then begin str.Add ('12:'+trim(frm_op_seae.t_op_seae.fieldbyname('主提单号').asstring)+':' +':::::' // 收货地 +trim(edit4.Text)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('装货港').asstring)+':' +'CY-CY'+':' +strtemp+':' +FormatDateTime('YYYYMMDD',frm_op_seae.t_op_seae.fieldbyname('开船日期').asdatetime)+#39); end else begin str.Add ('12:'+trim(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('主提单号').asstring)+':' +':::::' // 收货地 +trim(edit4.Text)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('装货港').asstring)+':' +'CY-CY'+':' +strtemp+':' +FormatDateTime('YYYYMMDD',frm_op_seae.t_op_seae.fieldbyname('开船日期').asdatetime)+#39); end; str.Add ('13:'+trim(edit3.text)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('卸货港').asstring)+':' +trim(edit3.Text)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('交货地点').asstring) +GetLoadPortEdiID(frm_op_seae.t_op_seae.fieldbyname('二程港口').asstring)+':' +trim(frm_op_seae.t_op_seae.fieldbyname('二程港口').asstring) +#39); Str.Add(GetShipperString); Str.Add(GetConsigneString); Str.Add(GetNOTIFYString); IF trim(frm_op_seae.t_op_seae.fieldbyname('货物标识').asstring)='' THEN strtemp:='S' else strtemp:=trim(frm_op_seae.t_op_seae.fieldbyname('货物标识').asstring); if not bsck.Checked then begin str.Add ('41:001:'+strtemp+':' // 货物标识 S/R/D/O +trim(frm_op_seae.t_op_seae.fieldbyname('件数').asstring) +'::' +trim(frm_op_seae.t_op_seae.fieldbyname('包装').asstring) +':' //第一层包装说明 +trim(frm_op_seae.t_op_seae.fieldbyname('重量').asstring) +'::' // 第一层包装尺码 +trim(frm_op_seae.t_op_seae.fieldbyname('尺码').asstring) // 第一层包装皮重 +#39); end else begin str.Add ('41:001:'+strtemp+':' // 货物标识 S/R/D/O +trim(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('件数').asstring) +'::' +trim(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('包装').asstring) +':' //第一层包装说明 +trim(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('重量').asstring) +'::' // 第一层包装尺码 +trim(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('尺码').asstring) // 第一层包装皮重 +#39); end; IF trim(frm_op_seae.t_op_seae.fieldbyname('货物标识').asstring)='R'THEN BEGIN str.Add ('43:' // 危险品、冷冻 +trim(frm_op_seae.t_op_seae.fieldbyname('温度单位').asstring) +':' +trim(frm_op_seae.t_op_seae.fieldbyname('设置温度').asstring) +':' +trim(frm_op_seae.t_op_seae.fieldbyname('最低温度').asstring) +':' +trim(frm_op_seae.t_op_seae.fieldbyname('最高温度').asstring) +#39); END; IF trim(frm_op_seae.t_op_seae.fieldbyname('货物标识').asstring)='D'THEN BEGIN str.Add ('43:' // 危险品、冷冻 +trim(frm_op_seae.t_op_seae.fieldbyname('危险品分类').asstring) +':' +trim(frm_op_seae.t_op_seae.fieldbyname('危险品编号').asstring) +':' +':' +':' +#39); END; Str.Add(GetMARKSString); // Str.Add(GetCARGODESCRIPTIONString); if not bsck.Checked then sl1.Text:=FormatEdiString(frm_op_seae.t_op_seae.fieldbyname('货物描述').AsString) else sl1.Text:=FormatEdiString(frm_op_seae_assistant.t_op_seae_assistant.fieldbyname('货物描述').AsString); GetLengthTString(sl1,70); sl.text:=''; for L:=0 to sl1.Count-1 do begin if Trim(sl1.Strings[L])<>'' then sl.Add(sl1.Strings[L]); end; M:=1; for L:=0 to sl.Count-1 do begin if M<=5 then begin if M=1 then begin s:='47:'+FormatEdiString(sl.Strings[L],0)+':'; end else begin if M=5 then s:=s+FormatEdiString(sl.Strings[L],0) else s:=s+FormatEdiString(sl.Strings[L],0)+':'; end; end else begin S:=S+''''; Str.Add(S); M:=1; s:='47:'+FormatEdiString(sl.Strings[L],0)+':'; end; M:=M+1; end; S:=S+''''; Str.Add(S); Count:=Count+11; strRmain:=''; try rs:=Tadoquery.Create(application); rs.Connection := frm_main.db; strsql:='select * from t_op_ctn where 编号=' +#39+frm_op_seae.t_op_seae.fieldbyname('编号').asstring+#39; rs.Close; rs.sql.clear; rs.sql.add(strsql); rs.Open; if not rs.IsEmpty then begin rs.First; while not rs.Eof do begin if rs.fieldbyname('备注').asstring='' then strtemp:='F' else strtemp:=copy(rs.fieldbyname('备注').asstring,1,1); str.Add ('51:001:'+trim(rs.fieldbyname('箱号').asstring)+':'+trim(rs.fieldbyname('封号').asstring)+':'+GetCtnCode(rs.fieldbyname('尺寸').asstring,rs.fieldbyname('箱型').asstring)+':'+strtemp+':' +trim(IntToStr(rs.fieldbyname('件数').AsInteger))+':'+trim(FloatToStr(rs.fieldbyname('重量').AsFloat))+':'+'''' ); rs.Next; end; end; rs.Close; rs.Destroy; except on e:exception do begin rs.Close; rs.Destroy; exit; end; end; end; count:=str.count; str.Add ('99:'+ inttostr(count+1)+#39); end; freeandnil(sl); freeandnil(sl1); SaveDialog1.FileName:=frm_op_seae.t_op_seae.fieldbyname('船名').asstring+frm_op_seae.t_op_seae.fieldbyname('航次').asstring; if SaveDialog1.Execute then begin str.SaveToFile(SaveDialog1.FileName+'.txt'); showmessage('文件生成成功!'); end else begin showmessage('文件生成失败!'); exit; end; inifile1:=Tinifile.Create(ExtractFilePath(application.ExeName)+'main.ini'); inifile1.WriteString('EDI','YDSEND',edit1.text); inifile1.WriteString('EDI','YDRECIEVE',edit2.text); inifile1.WriteString('EDI','YDPORTLOAD',edit4.text); inifile1.WriteString('EDI','YDPORTDISCHARG',edit3.text); inifile1.free; close; end; end.