TKDIS bomo opustili, kaj namesto njega ?

Vse drugo, kar ne spada v nobeno zgornjo kategorijo.
PeJo
Prispevkov: 988
Pridružen: 08.01.2003 16:10:34

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a PeJo » 21.07.2010 11:18:14

Še povezava na XSD shemo SEPA XML.

Pojdite dol do sekcije Second version of Payments Initiation messages in sicer shemi CustomerCreditTransferInitiationV02 ter PaymentStatusReportV02.
Včasih, se ti zdi, da znaš vse .... boom in se zbudiš

yuhuhu
Prispevkov: 19
Pridružen: 25.02.2005 09:54:31

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a yuhuhu » 21.07.2010 14:37:03

Tony, zanima me testni modul. Prosim, če ga lahko objaviš ...

B.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a Lee_Nover » 21.07.2010 15:45:45

o fuj. kak bebc je pisal to shemo .. kaksne grde okrajsave. bljak. sigurno si ga je zmislu nek stari, ki nima pojma o xml-u.
.. my 2 c ..
- I hate noobs -

[Mr_x]
Prispevkov: 678
Pridružen: 12.06.2001 15:12:58

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a [Mr_x] » 21.07.2010 19:40:38

Hehe, Lee je pač Lee!

1.Če mene prašaš je že sam xml kt en bruh, če pa še mal popackaš notr pa nastane en velk kup bruhanja.

2.Fantje, bolš taka koda kot nobena - to je vendar smisu tega foruma.
www.domas.com

TonyCaker
Prispevkov: 312
Pridružen: 27.09.2003 18:33:35

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a TonyCaker » 22.07.2010 08:23:14

Spodaj je koda, ki iz clientdataseta kreira XML. Se vedno testno, tako da ne vem, ali je XML OK.

Copyleft (=left anyone to copy ) za clane Delphi.si, vsem ostalim pa opozorilo, da je baje en, ki je ukradel moj program, postal impotenten.

Koda: Izberi vse

unit Banke_Export;
{ Modul za kreiranje XML datoteke za osnovi podatkov iz TKDIS. TonyCaker ala POB 22.07.2010

  Tipicen scenarij: ubogi Delphi programer je pred 15 leti sklofal TKDIS.txt.
                    Sedaj banke prehajajao na XML format, ki pa zal v eni strukturi
                    vsebuje vse mozne poslovne scenarije s tega podrocja, ki doletijo
                    podjetja v velikosti od 0 do 100.000 zaposlenih. Zato je dokumentacija
                    ustrezno obsezna (=bruh, gl. post Mr_x-a).
  Predlog resitve : vmesnik, kamor posljes "flat" podatke iz TKDIS, na drugi strani pa
                    pride ven XML. (Ce ima kdo kaj podobnega za zenske, mislim,
                    noter vrzes staro, ven pa pride mlada, se priporocam).
  Rezultat        : kreiranje XML datoteke za  ne da bi diplomiral na gori dokumentacije.
                    V lastnem programu bi samo naredil preslikavo polj.
  Nasa resitev    : natanko isti ClientDataset, ki je na UI prikazan kot seznam
                    za prenos na banko, se poslje v funkcijo SEPA_Export, ki zgenerira XML.
                    Urejeno v par urah.

  Spodaj je struktura datoteke, iz katere se pri nas kreira TKDIS. V glavnem sledi poljem
  na virmanu (Obr40, ce se kdo spomni, kaj je bilo to).

    KLJUC VARCHAR (7)  NOT NULL,     // id zapisa
    PAKET VARCHAR (7) ,              // paket
    OE VARCHAR (30) ,                // organizacijska enota SDK :-)
    BREME1 VARCHAR (30) ,            // Naslov nalogodajalca
    BREME2 VARCHAR (50) ,            // ...
    BREME3 VARCHAR (50) ,            // ...
    NAMEN1 VARCHAR (30) ,            // namen nakazila
    NAMEN2 VARCHAR (50) ,            // ...
    NAMEN3 VARCHAR (50) ,            // ...
    DOBRO1 VARCHAR (30) ,            // Naslov prejemnika
    DOBRO2 VARCHAR (50) ,            // ...
    DOBRO3 VARCHAR (50) ,            // ...
    ZIROBREME VARCHAR (30) ,         // TRR placnika
    SKLICOBREM VARCHAR (2) ,         // referenca nalogodajalca
    SKLICOBREM1 VARCHAR (30) ,       // ... drugi del
    DATUMVALUTE DATE,                // datum valutacija
    SIFRA1 VARCHAR (2),              // vrsta posla
    SIFRA2 VARCHAR (2),              // ...
    SIFRA3 VARCHAR (2),              // ...
    SIT CURRENCY_D,                  // EUR :-)
    ZIRODOBRO VARCHAR (30) ,         // TRR prejemnika
    SKLICDOBRO VARCHAR (2) ,         // referenca prejemnika
    SKLICDOBRO1 VARCHAR (30) ,       // ... drugi del
    BIC_NALOGODAJALCA VARCHAR (15),  // glej levo
    BIC_UPRAVICENCA VARCHAR (15),    // glej levo
    DATUM DATE,                      // datum kreiranja zapisa
    KRAJ VARCHAR (30) ,              // kraj vplacila (mislim, da je brez veze)
    VEZA VARCHAR (30) ,              // ? nikoli uporabljeno
    DOKUMENT VARCHAR (7) ,           // veza v saldakonte
    DOKVEZA VARCHAR (7) ,            // kot zgoraj
    KOMITENT VARCHAR (7) ,           // sifra prejemnika
    KONTO VARCHAR (6) ,              // glej levo
    STATUS VARCHAR (2) ,             // placano / caka placilo
    TA Char(1),                      // se uporablja za oznako (kot tag, amak z vec opcijami)
    VNESEL VNESEL_D,                 // sifra uporabnika, ki je zadnji speminjal
    DTSTAMP DTSTAMP_D                // timestamp zadnje spremembe

Zgornji ClientDataset se obenem z imenom datoteke poslje kot parameter v funkcijo, le-ta
pa jo zgenerira.

Work to do:
1. za sirso uporabo Clientdataset kot parameter morda ni najbolj posrecena opcija,
   ampak nam sluzi in smo imeli najmanj dela (=0) s prilagajanjem. Morda bi bilo
   bolje namesto dataseta v parameteru poslati poslati kar ime TKDIS datoteke, ki
   naj se prevede, vendar bi jo bilo treba dopolniti z BIC kodami in morda se cim.
2. imena polj so bolj boga
3. dodati kontrole (null, range,...)
4. pa se precej tega


}

interface

uses SysUtils, WinProcs, WinTypes, Classes, dbClient, DateUtils,
     Dialogs, DB;

var
  tmpVrstica : Boolean;

//**** podporne funkcije
function  PadVar(StIn:String; Count:Word):String;
function  Zamik(nPresledki : Integer):String;
function  XMLAddQuoted ( QuotedString, Value : String ) : String;
procedure XMLLineAdd(Value : String; list : TstringList; nZamik:Integer );

//**** export v XML
function  SEPA_Export( dsNakazilo:TClientDataset; cFileName:String ):Integer;
//**** wishlist
//function  SEPA_Import( dsNakazilo:TClientDataset; cXMLFileName:String ):Integer;

implementation

function PadVar(StIn:String;Count:Word):String;
var J:Word;
    StOut:String;
Begin
  StOut:=StIn;
  For J:=1 to Count do
    StOut:=StOut+' ';
  Result:= StOut;
End;

function Zamik(nPresledki : Integer):String;
begin
  Result := PadVar(' ', nPresledki-1);
end;

function XMLAddQuoted ( QuotedString, Value : String ) : String;
begin
  if Value = '' then begin
    tmpVrstica := False;
    Exit;
  end;
  tmpVrstica := True;
  Result := '<' + QuotedString + '>' + Value + '</'+ QuotedString + '>';
end;

procedure XMLLineAdd(Value : String;list: TstringList; nZamik: Integer);
begin
  if not tmpVrstica then begin
    tmpVrstica := True;
    exit;
  end;
  Value := UTF8Encode(Value);
  if nZamik > 0 then
    list.Append(Zamik(nZamik)+Value)
    else
    list.Append(Value);
end;


function  SEPA_Export( dsNakazilo:TClientDataset; cFileName:String ):Integer;
var a : TStringList;
    tmpZap, cSaveXmlTo : String;
    i,j, nReccount:integer;
    sumSit : Real;
begin
  Result := 0;

  cSaveXmlTo:= cFileName;
  if cSaveXmlTo <> '' then begin
    a := TStringList.Create;
    with dsNakazilo do begin
      try
        DisableControls;
        sumSit := 0;
        //Sestejemo zneske SIT (<StrlSum>)
        for i := 1 to RecordCount do begin
          sumSit := sumSit + FieldByName('SIT').AsFloat;
          Next;
        end;
        First;
        DecimalSeparator := '.';

        XMLLineAdd('<?xml version="1.0" encoding="utf-8"?>',a,0);
        XMLLineAdd('<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02" xmlns:sp="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'+
                   ' xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02.\pain_001_001_02.xsd">',a,0);
        //Glava
        XMLLineAdd('<pain.001.001.02>',a,0);
        XMLLineAdd('<GrpHdr>',a,0);
        XMLLineAdd(XMLAddQuoted('MsgId',FormatDateTime('yyyy-mm-dd',now)+'T'+FormatDateTime('hh:mm:ss',now)),a,2);
        XMLLineAdd(XMLAddQuoted('CreDtTm',FormatDateTime('yyyy-mm-dd',now)+'T'+FormatDateTime('hh:mm:ss',now)),a,2);
        XMLLineAdd(XMLAddQuoted('NbOfTxs',IntToStr(RecordCount)),a,2);
        XMLLineAdd(XMLAddQuoted('CtrlSum',FloatToStrF(sumSit,ffFixed,15,2)),a,2);
        XMLLineAdd(XMLAddQuoted('Grpg','SNGL'),a,2);
        XMLLineAdd('<InitgPty>',a,2);
        XMLLineAdd(XMLAddQuoted('Nm',FieldByName('BREME1').AsString),a,4);
        XMLLineAdd('<PstlAdr>',a,4);
        XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME2').AsString),a,6);
        XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME3').AsString),a,6);
        XMLLineAdd(XMLAddQuoted('Ctry','SI'),a,6);
        XMLLineAdd('</PstlAdr>',a,4);
        XMLLineAdd('</InitgPty>',a,2);
        XMLLineAdd('</GrpHdr>',a,0);
        //Konec Glave

        for i := 1 to dsNakazilo.RecordCount do begin
          //Payment info.

          XMLLineAdd('<PmtInf>',a,0);
          XMLLineAdd(XMLAddQuoted('PmtMtd','TRF'),a,2);
          XMLLineAdd(XMLAddQuoted('ReqdExctnD',FormatDateTime('yyyy-mm-dd',FieldByName('DATUM').AsDateTime)),a,2);
          XMLLineAdd('<Dbtr>',a,2);
          XMLLineAdd(XMLAddQuoted('Nm',FieldByName('BREME1').AsString),a,4);
          XMLLineAdd('<PstlAdr>',a,4);
          XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME2').AsString),a,6);
          XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME3').AsString),a,6);
          XMLLineAdd(XMLAddQuoted('Ctry','SI'),a,6);
          XMLLineAdd('</PstlAdr>',a,4);
          XMLLineAdd('</Dbtr>',a,2);

          XMLLineAdd('<DbtrAcct>',a,2);
          XMLLineAdd('<ID>',a,4);
          XMLLineAdd(XMLAddQuoted('IBAN','SI'+FieldByName('ZIROBREME').AsString),a,6);
          XMLLineAdd('</ID>',a,4);
          XMLLineAdd('</DbtrAcct>',a,2);

          //BICNalogodajalca
          XMLLineAdd('<DbtrAgt>',a,2);
          XMLLineAdd('<FinInstnId>',a,4);
          XMLLineAdd(XMLAddQuoted('BIC', FieldByName('BIC_NALOGODAJALCA').AsString),a,6);
          XMLLineAdd('</FinInstnId>',a,4);
          XMLLineAdd('</DbtrAgt>',a,2);

          { TODO : Hal E-Bank identifikator }
          //Zanka
          XMLLineAdd('<CdtTrfTxInf>',a,2);
          XMLLineAdd('<PmtId>',a,4);
          XMLLineAdd(XMLAddQuoted('InstrId',''),a,6);  // primer podatka: '17BF6J7A7BS866AN'
          {Referenca nalogodajalca v Halcomovi strukturirani obliki ali v nestrukturirani obliki.
           Če referenca nalogodajalca ni podana se poda vrednost »NOTPROVIDED«.}
          if FieldByName('SKLICOBREM1').AsString <> '' then
            XMLLineAdd(XMLAddQuoted('EndToEndId',FieldByName('SKLICOBREM1').AsString),a,6)
          else
            XMLLineAdd(XMLAddQuoted('EndToEndId','NOTPROVIDED'),a,6);
          XMLLineAdd('</PmtId>',a,4);

          XMLLineAdd('<PmtTpInf>',a,2);
          XMLLineAdd(XMLAddQuoted('InstrPrty','NORM'),a,4);
          XMLLineAdd('<LclInstrm>',a,4);
          XMLLineAdd(XMLAddQuoted('Cd','BN02'),a,6);
          XMLLineAdd('</LclInstrm>',a,4);
          XMLLineAdd('</PmtTpInf>',a,2);

          XMLLineAdd('<Amt>',a,2);
          XMLLineAdd('<InstdAmt Ccy="EUR">'+FloatToStrF(FieldByName('SIT').AsFloat,ffFixed,15,2)+'</InstdAmt>',a,4);
          XMLLineAdd('</Amt>',a,4);

          XMLLineAdd('<CdtrAgt>',a,2);
          XMLLineAdd('<FinInstnId>',a,4);
          XMLLineAdd(XMLAddQuoted('BIC', FieldByName('BIC_UPRAVICENCA').AsString), a,6);
          XMLLineAdd('</FinInstnId>',a,4);
          XMLLineAdd('</CdtrAgt>',a,2);

          XMLLineAdd('<Cdtr>',a,2);
          XMLLineAdd(XMLAddQuoted('Nm',FieldByName('DOBRO1').AsString),a,4);
          XMLLineAdd('<PstlAdr>',a,4);
          XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME2').AsString),a,6);
          XMLLineAdd(XMLAddQuoted('AdrLine',FieldByName('BREME3').AsString),a,6);
          XMLLineAdd(XMLAddQuoted('Ctry','SI'),a,6);
          XMLLineAdd('</PstlAdr>',a,4);
          XMLLineAdd('</Cdtr>',a,2);

          XMLLineAdd('<CdtrAcct>',a,2);
          XMLLineAdd('<Id>',a,4);
          XMLLineAdd(XMLAddQuoted('IBAN',FieldByName('ZIRODOBRO').AsString),a,6);
          XMLLineAdd('</Id>',a,4);
          XMLLineAdd('</CdtrAcct>',a,2);

          XMLLineAdd('<RgltryRptg>',a,2);
          XMLLineAdd('<RgltryDtls>',a,4);
          //INF = "A3011"
          XMLLineAdd(XMLAddQuoted('INF',Format('%s%s%s',[FieldByName('SIFRA1').AsString,FieldByName('SIFRA2').AsString,FieldByName('SIFRA3').AsString])),a,6);
          XMLLineAdd('</RgltryDtls>',a,4);
          XMLLineAdd('</RgltryRptg>',a,2);

          XMLLineAdd('<RmtInf>',a,2);
          XMLLineAdd('<Strd>',a,4);
          XMLLineAdd('<CdtrRefInf>',a,6);
          XMLLineAdd(XMLAddQuoted('CdtrRef',Format('/SIB/%s/%s',[FieldByName('SKLICDOBRO').AsString, FieldByName('SKLICDOBRO1').AsString])),a,8);
          XMLLineAdd('</CdtrRefInf>',a,6);
          XMLLineAdd(XMLAddQuoted('AddtlRmtInf',FieldByName('NAMEN1').AsString),a,6);
          XMLLineAdd('</Strd>',a,4);
          XMLLineAdd('</RmtInf>',a,2);
          XMLLineAdd('</CdtTrfTxInf>',a,2);
          XMLLineAdd('</PmtInf>',a,0);
          Next;
        end;//for

        XMLLineAdd('</pain.001.001.02>',a,0);
        XMLLineAdd('</Document>',a,0);
        a.SaveToFile(cSaveXmlTo);
        MessageDlg('Datoteka je shranjena v '+cSaveXmlTo,mtInformation,[mbOK],1);
      finally
        a.Free;
        // SaveDialogXml.Free;
        dsNakazilo.EnableControls;
        dsNakazilo.First;
      end;
    end;
  end //Cancel SaveDialogXml
  else
    MessageDlg('Postopek je prekinil uporabnik',mtInformation,[mbOK],1);
end;

end.
 
A s ti tut not padu ?

TonyCaker
Prispevkov: 312
Pridružen: 27.09.2003 18:33:35

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a TonyCaker » 22.07.2010 08:26:51

Aja, pojasnilo za "Urejeno v par urah.". Misljeno je bilo "sprogramirano" v par urah. Za iskanje pravih informacij kaj in kako pa je slo ene dva dni.
A s ti tut not padu ?

[Mr_x]
Prispevkov: 678
Pridružen: 12.06.2001 15:12:58

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a [Mr_x] » 22.07.2010 08:59:00

JA hvala stari za tole :=)
www.domas.com

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a Runner » 22.07.2010 12:29:32

@TonyCaker

A jaz prav vidim, da si ti XML sestavil kar lepo na roko iz stringov. Ajajaj, lepo prosim da takoj potegneš dol OmniXML (Ali pa uporabi kakšen drug XML parser). Lahko potem uporabiš še moj SimpleStorage ki ima tudi možnost adapterjev, tako da lahko narediš custom import / export iz ClientDataSet v XML in obratno.

Pa tudi če uporabiš samo SimpleStorage tak kot je bo koda 100x lepša in bolj berljiva. Res lepo prosim da se tole sprogramira na pravilen način. Ker potem se zgodi to kar se je že. Mr_x skopira kodo in že imamo to grozoto na dveh mestih. Pripravljen sem ti pomagati kolikor je treba, ampak tega pa res ne bi gledal no. :(

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a gabr » 22.07.2010 12:38:14

Pa tudi če uporabiš samo SimpleStorage tak kot je bo koda 100x lepša in bolj berljiva. Res lepo prosim da se tole sprogramira na pravilen način. Ker potem se zgodi to kar se je že. Mr_x skopira kodo in že imamo to grozoto na dveh mestih. Pripravljen sem ti pomagati kolikor je treba, ampak tega pa res ne bi gledal no. :(
Hehe, a ti si se tudi zasekiral.

Jaz sem gledal kodo pet sekund in si rekel: "Čez vikend mu prepišem to solato v GpFluentXml." :)

[Mr_x]
Prispevkov: 678
Pridružen: 12.06.2001 15:12:58

TKDIS bomo opustili, kaj namesto njega ?

Odgovor Napisal/-a [Mr_x] » 22.07.2010 13:01:59

Mislm sama dobrota vas je. Itak sm čist potn in mam prste na Ctrl+C !

Ampk je pa luštn, ko takole forum zaživi ...
www.domas.com

Odgovori