Kamis, 26 Mei 2011

Remote Desktop and my Foolishness


spAXrrtaaaaaaann!! ...

So ... this is my foolishness at my work ...

Selama project berlangsung kami mendeploy XPO-xpo dengan cara Remote Desktop ke server. Disini kami membuat beberapa user untuk bisa Remote Desktop. Pada suatu saat License Remote Desktop di Server client kami habis masa berlakunya dan terpaksa kami membeli tiga license.

Disini yang menarik ... untuk bisa mengakses dan melakukan Remote Desktop kami harus absen dahulu seperti "saya masuk ke bla bla bla (maksudnya ip server) ...". Karena satu user untuk satu session dan jika ada yang bentrok maka user pertama kali yang masuk langsung keluar dari Remote Desktop tersebut.Dengan keadaan ini ada juga yang sampai Marah-marah sehingga mendatangkan pertengkaran dan saling menyalahkan*.

Dan hari ini saya mendapatkan tips untuk menanggulangi "Pertengkaran" tersebut ...maksudnya menanggulangi masalah Sesion Remote Desktop ini.

Kebetulan waktu itu client kami menggunakan Windows Server 2008.
di Menu Server Manager
kita bisa masuk
Roles
Terminal Services
Terminal Services Configuration
(di Group Edit Setting);
ubah Menu Restrict user to single session di rubah keNo

n Voila! walau teman kita masuk dengan log-in yang sama untuk Remote Desktop tidak akan saling mengakhiri Sesion Remote Desktop teman kita yang sudah masuk duluan.

Terima Kasih pada Om Daru Prasetyo ... :) bermanfaat banget nih Info-nya ...hehehe


*(Paling ga suka gw kalo dibilang 'Jangan bikin kerja gw lambat' or 'Bottle neck' ... itu sama saja ga nghargain usaha orang itu. daripada marah dan ngatain orang, Lebih bijak kalo kita bantu Orang yang mengalami kesulitan dalam pekerjaannya.so, siklus kerja jadi bisa berjalan kembali ... :) )

Rabu, 25 Mei 2011

Make footer appear at the end of the page


spAXrrttaaaann!! ...

Waktu itu user mencoba mencetak Purchase Order yang lumayan banyak list itemnya. Saat proses print dan menampilkannya di Screen footer PurchaseOrder tampil disetiap Halaman. Sedangkan Idealnya sebuah footer menurut versi user saya footer tersebut harus berada di akhir halaman (kondisi Report PurchPurchaseOrder sudah kami modifikasi dengan menambahkan satu footer lagi untuk Tanda Tangan user-user yang bertanggung jawab untuk Dokumen Purchase order ini).

dan bertambah kembali-lah pekerjaan modifikasi kami. Kami menambahkan dan memodifikasi beberapa Syntak yang ada di method fetch PurchPurchaseOrder ...

Pertama:
Saya tambahkan PageFooter tambahan yang isinya Kotak-kotak Yang akan dipakai user untuk Tanda tangan.
Kedua:
Saya tambahkan variable Boolean printFooter di classdeclaration di Report PurchPurchaseOrder
Ketiga:
Saya tambahkan method executeSection seperti ini ...
void executeSection()
{
if (printReference)
super();

printReference = true;
}
Keempat:
di method Fetch di modifikasi seperti ini di bagian ...

while (purchFormLetterReport.moveNextPrintSetting())
{
// Set print settings for this report
element.unpackPrintJobSettings(purchFormLetterReport.getCurrentPrintSetting().parmPrintJobSettings().packPrintJobSettings());
element.printJobSettings().copies(purchFormLetterReport.getCurrentPrintSetting().parmNumberOfCopies());
element.printJobSettings().fitToPage(false);
/*Original start
printFooter = this.totalsPage(FirstLast::First, vendPurchOrderJour.AmountPurchaseOrder);
printFooterEuro = this.totalsPage(FirstLast::First, vendPurchOrderJour.AmountPurchaseOrder && element.printEuroTotals());
printDocuHeader = false;
*/Original end
//Hy's modified start
printFooter = this.totalsPage(FirstLast::Last, vendPurchOrderJour.AmountPurchaseOrder);
printFooterEuro = this.totalsPage(FirstLast::Last, vendPurchOrderJour.AmountPurchaseOrder && element.printEuroTotals());
printDocuHeader = false;
//Hy's modified end

setelah itu di bagian ini ... masih di method fetch

/* Original Start
if (element.pagesTotal())
{

printFooter = this.totalsPage(FirstLast::Last, vendPurchOrderJour.AmountPurchaseOrder);
printFooterEuro = this.totalsPage(FirstLast::Last, vendPurchOrderJour.AmountPurchaseOrder && element.printEuroTotals());
}
*/ Original end
//Hy's Modified start
if (element.pagesTotal())
{
printFooter = this.totalsPage(FirstLast::First, vendPurchOrderJour.AmountPurchaseOrder);
printFooterEuro = this.totalsPage(FirstLast::First, vendPurchOrderJour.AmountPurchaseOrder && element.printEuroTotals());
//printReference ... variable yang mewakili PageFooter baru yang saya buat
printReference = this.totalsPage(FirstLast::First,vendPurchOrderJour.AmountPurchaseOrder);
}
else
//Hy's modified end

Senin, 23 Mei 2011

Find Data Voucher in LedgerTrans


spAXrrtaaaaaaaaaaaannn!! ...

Saat Itu saya mempunyai Requirement Report yang resource data-nya entah dari table mana. Dan saya hanya mempunyai clue dari Contoh datanya saja. Data-data yang akan ditampilkan itu berupa data2 Voucher dan ada Amount Debit Creditnya ...
Saya sama sekali Blank dengan Debit Credit dan tetekbengeknya ... dulu waktu SMU pelajaran yang saya Ikuti dan BT sama sekali adalah Accounting. Dan Waktu kuliah saya bertemu lagi dengan mata Kuliah itu.Ditambah dengan Dosen yang ga Asyik jadi semakin parahk lah Perhitungan dan pengertian debit credit saya.

Dari Lihat Contoh di Spek Requirementnya data tersebut di mulai dengan data Voucher,Dimension,Currencycode, Original Amount, Debit dan Credit ...
Dengan melakukan kenekatan akhirnya Saya pakai cara untung-untungan saja untuk membuat report tersebut. Dan akhirnya dengan bantuan teman saja pula saya mendapatkan Contoh Table yang Datanya mirip dengan contoh data yang Data Di Spek Report. Table itu adalah LedgerJournalTrans.
Setelah aku oprek dan membuat reportnya berdasarkan Table LedgerJournalTrans ... ternyata report ku itu masih salah karena data yang aku keluarkan tidak Detail. Dan Consultannya memperlihatkan form yang bisa aku ambil resoource-nya yaitu di Menu General Ledger-Journal-Lines-Journal Voucher-Inquiries Button-Voucher Transaction.

Di Voucher Transaction ini aku bisa melihat Detail datanya...
Sekarang yang menjadi pertanyaanku adalah bagaimana aku bisa mendefinisikan bahwa Amount Voucher itu masuk Kolom Debit atau Kredit?? ...
Sedangkan di Table LedgerJournalTrans kita bisa melihatnya dengan mudah. Satu-satunya clue Amount Voucher tersebut termasuk Debit atau Kredit adalah dia rata kanan untuk Kredit rata Kiri untuk Debit.Dari sana aku lihat ke EDT field LedgerTrans.AmountMST tersebut ternyata dia mempunyai properties seperti ini.

mmm ... ternyata properties DisplaceNegativenya yang bisa membuat dia rata kanan atau rata kiri. Lalu pertnyaan berikutnya muncul... bagaimana saya bisa mengakses properties tersebut untuk bisa saya mendefinisikan bahwa Amount Voucher yang sedang di query masuk ke kolom Debit atau Kredit. dan Sumpah ... selalu saja ada pertanyaan lagi! ...
Dan aku terus mencari lagi bagaimana aku bisa mendefinisikan dia Debit atau Kredit dan akhirnya ketemu....
Disini sepertinya ...

Ternyata di LedgerTrans ada Field Crediting yang bisa menunjukan voucher yang dimaksud itu masuk Debit atau Kredit.

dan akhirnya aku bisa mendefinisikan Amount Credit dan juga Debit.
Aku membuat method Display di table LedgerTrans seperti ini
Display Amount AmountCredit()
{
Amount credit;
;

if(this.Crediting == NoYes::Yes)
{
credit = this.AmountMST;
}
return credit;
}
dan
Display Amount AmountDebit()
{
Amount debit;
;

if(this.Crediting == NoYes::No)
{
debit = this.AmountMST;
}
return debit;
}

... bener ga ya? ...hihi...

Rabu, 11 Mei 2011

TextBuffer at Dynamics Ax and my Foolishness


spAXrrttaaaaannnn!! ...

So ... this is my foolishness at my work ...
My friend erick want me to help him to produces some report which display a comment from user's input. so I used Memo for the String length in order to handle a possibility of length from the comment ... coz the comment may be like a story, have many paragraph. But unfortunately after the report is running there's some paragraph not displayed at the report and its because the height of the object who generated from EDT which is have lenght memo. in other word the object's height(which is generated from String) is not dynamic
So i use TextBuffer Class to handle this problem.
Here we are ... the TextBuffer ...

public class ReportRun extends ObjectRun
{
transdate Fromdate, Todate;
dialogfield dialogfromdate,dialogtodate,dialogComment;
transdate tempDate;
CustAccount tempCustAccount;
qty tempQty;
qty tempQtyconv;
str tempitemid;
IBMKeterangan Keterangan;
int i;
int panjangstr;

//TextBuffer Class
TextBuffer tb;
}

at Fetch
public boolean fetch()
{
boolean ret;
tb = new TextBuffer();



element.query().dataSourceNo(1).addRange(fieldnum(salesline,ShippingDateConfirmed)).value(strfmt('%1..%2',fromdate,todate));

tb.setText(Keterangan);

panjangstr = tb.numLines();
DistempKeterangan.height(panjangstr,units::char);

ret = super();

return ret;
}

Wait ..so where the Foolishness???
Here is the Foolishness ... to Handle the Dynamic Height's object you don't have to use TextBuffer class because Microsoft Dynamics Ax have a feature for this issue.
You can find the solving problem in a properties from the object which is generated from the variable that u have.

just right click from the object -> properties -> and voila ..there's a DynamicsHeight.
Change the DynamicsHeight to Yes.

Waakakkak .. Damd it!.

Erorr CS1963 - An expression tree may not contain a dynamic operation.

Kali ini saya mendapatkan erorr dengan code CS1963, padahal sebelumnya saya sudah mendefinisikan 'var item in Model' di @foreach(var...