StudioSystem

j_insert_update - zaawansowane programowanie - pozycje dokumentu cz. 3

Platforma StudioSystem i zaawansowane programowanie dają ogromne możliwości tworzenia oprogramowania. Ta platforma zapewnia pełny zestaw narzędzi i technologii, które upraszczają proces tworzenia i wdrażania aplikacji oraz zarządzania nimi. Zaawansowane języki programowania, takie jak C# i Java, umożliwiają programistom tworzenie aplikacji o szerokim zakresie możliwości i funkcji.

studiosystem.softwarestudio.com.pl/transakcje/
Panel startowy platformy StudioSystem z modułami przypisanymi do roli użytkownika
Panel startowy platformy StudioSystem z modułami przypisanymi do roli użytkownika

Platforma StudioSystem oferuje szereg funkcji, które czynią ją idealnym wyborem do tworzenia oprogramowania. Dzięki zintegrowanemu środowisku programistycznemu programiści mogą tworzyć aplikacje w ułamku czasu, jaki zajęłoby to tradycyjnymi metodami. Platforma udostępnia również bibliotekę gotowych komponentów, których można użyć do dostosowania lub rozszerzenia istniejących funkcji. Eliminuje to konieczność wykonywania oddzielnych zadań związanych z kodowaniem lub debugowaniem, umożliwiając programistom skupienie się na tworzeniu unikalnych aplikacji.

W poprzednich artykułach opisałem metodę wykorzystania transakcji j_insert_update.aspx do przygotowania formularza dopisywania pozycji dokumentu. Poniższy artykuł jest kontynuacją  i opisuje zmiany w projektowaniu formularza pozwalające na zatwierdzenie dokumentu.

W poprzednim artykule opisałem jak stworzyć formularz taki jak ten:

Łatwo zauważyć, że możemy dane do bazy dodawać, ale brakuje przycisku ZAPISZ, który zapisze dane jako dokument zatwierdzony (zapisze ACH=1 i nada kolejny numer dokumentu).

KROK 1

Zmieniamy funkcje SsOnReady w której wskazujemy że po kliknięciu przez użytkownika na przycisk ZAPISZ ma wykonać się nowa funkcja o nazwie ZapiszDokument()

function SsOnReady() {
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").attr("onclick", "return ZapiszDokument();");
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").hide();
}

oraz ukrywamy przycisk, aby był on niedostępny dla użytkownika do momentu dodania pierwszej pozycji dokumentu.

Krok 2

W funkcji wykonywanej po dodaniu pozycji dodaję polecenie

$("#ctl00_ContentPlaceHolder1_ButtonZapisz").show();

które pokaże przycisk zapisania dokumentu, tak aby użytkownik mógł dokument zatwierdzić.

function DodajSucceeded(wynik) {
 if (wynik != "") {
 PokazAlert("Komunikat", wynik, 220, 400);
 return;
 }
 $("#UWAGI").val('');
 $("#ILOSC").jqxNumberInput('setDecimal', 1);
 UstawDphanTable('TABELA');
 JqxResetValue("NRIDASN");
 $("#NRIDASN").jqxComboBox('focus');
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").show();
}

KROK 3

Dodajemy funkcje ZapiszDokument(), która wykona zapis dokumentu

 function ZapiszDokument() {
 cTablica = new Array();
 var cLicznik = 0;
 $('[ssupdate]').each(function (index) {
 cTablica[cLicznik] = new cListaKontrolek($(this));
 cLicznik++;
 })
 PageMethods.UpdateData('dphan', cTablica, '1', 'NRDOKUMENTU=ZAM#RRRR-#MM-#XXXXX#TYP', 'refno=' + gcRefno + " AND ACH='0'", 'softwarestudioConnectionString', ThisOnSucceeded, OnFailed);
 return false;
}

Funkcja pobiera dane z kontrolek oznaczonych za pomocą znacznika ssupdate i uruchamia metodę UpdateData. Parametry metody:

  • nazwa tabeli w bazie SQL w której chcemy zaktualizować dane np. 'dphan’
  • Tablica z danymi z kontrolek oznaczonych jako ssupdate (patrz opis poniżej)
  • znacznik ACH , standardowo zatwierdzony dokument nadajemy wartość 1,
  • parametr wskazujący na nazwę kolumny oraz format numeru dokumentu. Jeżeli wartość parametru jest pusta to numer nie będzie nadawany. W powyższym przykładzie chcę aby numer został zapisany w kolumnie NRDOKUMENTU, a jego typ to ZAM (pierwsze 3 znaki po znaku =), kolejne znaki to sposób formatowania numeru dokumentu, np. 2015-01-00005ZAM ponieważ format to RRRR-MM-XXXXX-TYP
  • warunek filtrowania wierszy które mają być aktualizowane, zwykle aktualizujemy wiersze dotyczące danego dokumentu, a więc refno, gdzie zmienna gcRefno zawiera numer referencyjny podawany przy uruchomieniu transakcji w parametrze refno
  • parametr wskazujący na nazwę połączenia z bazą danych SQL, domyślnie program używa połączenia o nazwie: softwarestudioConnectionString
  • Nazwa funkcji jaka ma być uruchomiona, gdy zapis zakończy się powodzeniem, np. ThisOnSucceeded
  • Nazwa funkcji jaka ma być uruchomiona, gdyby wystąpił błąd zapisu, zwykle korzystamy ze standardowej: OnFailed

Zapis danych przy zatwierdzaniu

Zatwierdzając dokument możemy zdecydować, aby dane ze wskazanych kontrolek zostały pobrane i aktualizowały rekordy dokumentu. Do tego celu używam znacznika ssupdate=1, który umieszczam w kolumnie parametry dla wybranych kontrolek:

Rozwiązania zapewnia, że pozycje będą miały przypisaną wartość przy zatwierdzeniu, nawet jeżeli użytkownik dane na zakładce nagłówek uzupełnił na końcu. Ustawiłem je dla kontrolek miejsce dostawy (NRIDCRM), termin dostawy (TERMIN) i opis (UWAGI). Pola te zostaną zaktualizowane przy zatwierdzaniu dokumentu.

Podsumowanie

Za pomocą własnego skryptu można wykreować formularz dopisywania wielopozycyjnych dokumentów wraz z zatwierdzaniem i nadawaniem numeru dokumentu. Można tworzyć logikę biznesową wykorzystując JQuery i zapytani do bazy SQL.

Poniżej cały kod pliku crm_dphan.js jaki wykorzystałem do obsługi opisywanej transakcji rejestrowania zamówienia.

function SsOnLoad() {
 $('#BTN_DODAJ').html("<span id='btnDodaj' onclick='return btnDodaj()' class='art-button art-buttonBlue' style='width: 200px; '>Dodaj</span>");
 UstawDphanTable('TABELA');
 $('#captionTABELA').css('width', '10px');
}
function SsOnReady() {
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").attr("onclick", "return ZapiszDokument();");
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").hide();
}
function btnDodaj() {
 // kontrola wymagalnych pól
 if (!TestWypelnienia()) {
 return false;
 }
 // ustaw kontrahenta jako nieedytowalny
 $("#NRIDODN").jqxComboBox({ disabled: true });
cTablica = new Array();
 var cLicznik = 0;
 $('[ssPostBack]').each(function (index) {
 cTablica[cLicznik] = new cListaKontrolek($(this));
 cLicznik++;
 })
PageMethods.SendForm(cTablica, '0', DodajSucceeded, OnFailed);
return false;
}
function DodajSucceeded(wynik) {
 if (wynik != "") {
 PokazAlert("Komunikat", wynik, 220, 400);
 return;
 }
 $("#UWAGI").val('');
 $("#ILOSC").jqxNumberInput('setDecimal', 1);
 UstawDphanTable('TABELA');
 JqxResetValue("NRIDASN");
 $("#NRIDASN").jqxComboBox('focus');
 $("#ctl00_ContentPlaceHolder1_ButtonZapisz").show();
}
function UstawDphanTable(cKontrolka) {
 var idGrid = 'grid' + cKontrolka;
 $('#' + cKontrolka).html("<div id='" + idGrid + "' ></div>");
 var cZrodlo = PobierzDataTable("UPPER(ID_DPHAN) AS ID_DPHAN, knaso.INDEKS, knaso.NAZWAAS, dphan.UWAGIPOZ, dphan.ILOSC FROM dphan INNER JOIN knaso ON dphan.NRIDASN = knaso.NRIDASN WHERE dphan.REFNO = " + gcRefno);
var source =
 {
 datatype: "json",
 datafields: [
 { name: 'INDEKS', type: 'string' },
 { name: 'NAZWAAS', type: 'string' },
 { name: 'UWAGIPOZ', type: 'string' },
 { name: 'ILOSC', type: 'string' }
 ],
 localdata: cZrodlo,
 id: 'ID_DPHAN'
 };
 var dataAdapter = new $.jqx.dataAdapter(source);
$("#" + idGrid).jqxGrid(
 {
 theme: 'energyblue',
 height: '250px',
 width: '1000px',
 source: dataAdapter,
 altrows: true,
 columns: [
 { text: 'Indeks', datafield: 'INDEKS', width: 200 },
 { text: 'Nazwa', datafield: 'NAZWAAS', width: 300 },
 { text: 'Ilość', datafield: 'ILOSC', width: 80, cellsalign: 'right', cellsformat: 'n' },
 { text: 'Uwagi', datafield: 'UWAGIPOZ', width: 300 }
 ]
 });
JqxFormatujGrid('#' + idGrid);
}
function ZapiszDokument() {
 cTablica = new Array();
 var cLicznik = 0;
 $('[ssupdate]').each(function (index) {
 cTablica[cLicznik] = new cListaKontrolek($(this));
 cLicznik++;
 })
 PageMethods.UpdateData('dphan', cTablica, '1', 'NRDOKUMENTU=ZAM#RRRR-#MM-#XXXXX#TYP', 'refno=' + gcRefno + " AND ACH='0'", 'softwarestudioConnectionString', ThisOnSucceeded, OnFailed);
 return false;
}

Chcesz zobaczyć transakcje w działaniu?

Uruchom demo modułów StudioSystem i sprawdź platformę na żywo.