j_insert_update – zaawansowane programowanie – pozycje dokumentu cz. 3

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:

insert_update zakładka nagłówek

insert_update zakładka pozycje

 

Ł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:

insert_update ssupdate

 

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;
}