MOSS / InfoPath Borang Server (InfoPath 2007) senarai drop-down prestasi

Kategori tambahan: InfoPath

Ringkasan: InfoPath Satu 2007 membentuk dikerahkan ke server MOSS yang menyediakan senarai drop-down vendor terikat kepada senarai MOSS adat. Apabila memilih penjual, peraturan menetapkan nilai lapangan untuk beberapa medan teks seperti nama wakil jualan, alamat, bandar, negeri, zip dan telefon. Prestasi adalah dahsyat. Kami sedar akan hakikat bahawa prestasi menjadi lebih teruk (dalam fesyen linear) bagi setiap bidang tambahan kami mengemaskini begini. Iaitu, Jika kita hanya nama wakil jualan di Kemaskini., Ia mengambil masa [x] Jumlah masa. Jika kami mengemaskini wakil jualan, address1, address2, bandar, negeri, zip, Ia mengambil masa 10 lagi times.

Penyelesaian: Menulis perkhidmatan web (Contoh kod boleh ditemui di sini) yang diluluskan atas nama penjual dan kembali kembali butiran Penjual. Kemudian, Peruntukkan bidang begini. Walaupun ini nampaknya terlalu perlahan, Jadilah ada perbezaan petanda prestasi apabila kami ditugaskan 1 bidang berbanding 8 bidang. Sebagai bonus tambahan, pengguna mendapat yang sejuk "menghubungi pelayan" Kitu kesan sementara mereka menunggu untuk borang untuk memohon dan mengambil keputusan Perkhidmatan.

MOSS: Pengecualian berlaku. (Kecualian dari HRESULT: 0x80020009 (DISP_E_EXCEPTION))

UPDATE: Kami tidak pernah menentukan punca masalah ini dan ia tidak pernah timbul lagi.

Kami notis semasa pelaksanaan tapak pembangunan yang tiba-tiba, dua pengguna tidak dapat untuk mengakses koleksi tapak. Mereka akaun boleh mengesahkan ke laman utama, tetapi apabila cuba untuk mengakses koleksi tapak tertentu, mereka hanya mendapat skrin kosong. Tiada ralat yang dipaparkan, hanya halaman kosong putih.

Kami log masuk sebagai admin koleksi tapak dan cuba untuk menambah satu dari orang-orang pengguna sebagai admin laman dan masa ini, apabila menekan "OK", kita akan mendapat mesej ini:

Pengecualian berlaku. (Kecualian dari HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Kami menghabiskan masa beberapa penyelidikan ini dan malangnya, tidak datang dengan apa-apa yang berguna. Terdapat beberapa mesej dalam log diagnostik, tetapi ia adalah sukar untuk betul-betul mengaitkan mereka dengan isu ini.

Pada akhir, kita memotong koleksi tapak dan semula mencipta dan yang diselesaikan.

Jika saya memikirkan apa yang menyebabkan ini pada masa akan datang, Saya akan mengemaskini post ini.

MOSS: Iterating melalui senarai adat dan kembali data ditapis untuk InfoPath

Senario Perniagaan:

Menyediakan satu kaedah yang membolehkan pengguna untuk memasukkan tuntutan pembelian yang tepat dengan cepat.

Masalah perniagaan:

Pelanggan menjalankan perniagaan dengan beberapa ratus vendor.

Vendor akan "taipkan" tertentu. Ini bermakna bahawa penjual menjual peralatan komputer (e.g. Dell) atau bekalan pejabat (e.g. Staples).

Bagaimana kami membolehkan pengguna yang membuat pembelian requisitions Pilih vendor sah?

Penyelesaian perniagaan yang:

Membezakan vendor dalam sistem melalui "jenis".

Membolehkan pengguna untuk memilih jenis"" produk dan kemudian menyediakan set yang ditapis sesuai vendor.

Penyelesaian teknikal:

Satu bentuk InfoPath telah direka yang membolehkan pengguna untuk memasukkan online membeli requisitions.

Dua senarai pemilihan InfoPath mengawal pemilihan vendor. Pertama, pengguna memilih "jenis pembelian". Ini menghadkan senarai pilihan kedua untuk mengandungi hanya vendor yang menjual untuk jenis pembelian itu. Ini adalah satu klasik dihasratkan jatuh.

Vendor yang disimpan dalam senarai tersuai MOSS dengan adat kolum untuk penjual sifat-sifat seperti nama, alamat dan terutamanya "jenis".

Melaksanakan perkhidmatan web untuk klien InfoPath untuk mengambil yang iterates melalui senarai tersuai Penjual, pulang sahaja vendor yang sepadan yang dibekalkan "jenis".

Memohon Perkhidmatan web melalui borang InfoPath.

Pengajaran yang dipelajari:

  • Pertama, Ia seolah-olah perlu pergi laluan ini. Saya mempunyai pilihan untuk melakukan penapisan sepenuhnya di dalam lingkungan InfoPath dan tidak mencipta sebarang web Perkhidmatan fungsi di sini. Walau bagaimanapun, Borang pelayan tidak memberi diperlukan keupayaan penapisan. Kita boleh meletakkan peraturan ke yang jenis"yang" Senarai pilihan berupa semacam membuka semula pertanyaan Penjual, tetapi kita tidak boleh mendapatkannya untuk bekerja dengan betul. Oleh itu, Ia adalah perlu untuk melaksanakan perkhidmatan web.
  • Inilah klasik "cascading pilihan senarai" masalah dalam InfoPath dalam membentuk dunia pelayan dan terdapat banyak baik contoh di luar sana yang menerangkan cara untuk menyelesaikan masalah ini.
  • Nilai kosong untuk sebuah kolum dalam senarai Penjual tidak kembali rentetan yang kosong apabila dirujuk seperti ini: initItem["Nama penjual."]. Sebaliknya, kembali kosong yang.

Sesetengah nota yang lain:

  • Aku kembali pelbagai[] vendor kerana saya menghadapi beberapa masalah yang kembali ArrayList yang. InfoPath telah mengadu tentang hal itu dan saya tidak mempunyai masa atau kecenderungan untuk melawan ke atas. Ini, sudah tentu, meletakkan had tiruan untuk jumlah vendor. Ia juga dipaksa saya melaksanakan trim yang() Kaedah pelbagai kerana aku benci idea untuk memulangkan kembali 100's daripada vendor terbatal. InfoPath tidak peduli, tetapi ia nagged saya. (Lagi, ini adalah lebih mudah daripada berlawan InfoPath mengenai ArrayLists).
  • Saya melaksanakan GetSpecificVendorByName yang() fungsi serta, yang mungkin menjadi pelajaran.

Kod:

menggunakan Sistem;
menggunakan System.Web;
menggunakan System.Web.Services;
menggunakan System.Web.Services.Protocols;
menggunakan Microsoft.SharePoint;
menggunakan System.Configuration;

/// <Ringkasan>
///
Penjual Perkhidmatan: Menyediakan penjual yang berkaitan perkhidmatan hari yang dimakan oleh borang pelanggan infopath.
///
/// Sejarah:
/// ——–
/// 07/24/07: Awal pengkodan, Paul J. Gavin Conchango.
///
/// </Ringkasan>
[WebService(Ruang nama = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
awam kelas VendorService : System.Web.Services.WebService
{

/// <Ringkasan>
/// Mewakili sebuah syarikat penjual dari senarai tersuai sharepoint diselenggara oleh MSUSA.
/// </Ringkasan>
awam kelas Penjual
{
awam Penjual() { }

awam Penjual(SPItem initItem)
{
jika (! (initItem["Nama penjual."] == Batal)) VendorName = initItem["Nama penjual."].ToString();
jika (! (initItem["Alamat 1"] == Batal)) VendorAddress1 = initItem["Alamat 1"].ToString();
jika (! (initItem["Alamat 2"] == Batal)) VendorAddress2 = initItem["Alamat 2"].ToString();
jika (! (initItem["City"] == Batal)) VendorCity = initItem["City"].ToString();
jika (! (initItem["VendorPhone"] == Batal)) VendorPhone = initItem["VendorPhone"].ToString();
jika (! (initItem["PurchaseType"] == Batal)) VendorType = initItem["PurchaseType"].ToString();
jika (! (initItem["Negeri"] == Batal)) VendorState = initItem["Negeri"].ToString();
jika (! (initItem["Zip"] == Batal)) VendorZip = initItem["Zip"].ToString();
jika (!(initItem["Perkhidmatan Faks"] == Batal)) VendorFax = initItem["Perkhidmatan Faks"].ToString();
jika (!(initItem["SalesRepName"] == Batal)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unik ID dikekalkan melalui MOSS.
}

awam int VendorItemId;
awam rentetan VendorName;
awam rentetan VendorAddress1;
awam rentetan VendorAddress2;
awam rentetan VendorCity;
awam rentetan VendorState;
awam rentetan VendorZip;
awam rentetan VendorPhone;
awam rentetan VendorType;
awam rentetan VendorSalesRepName;
awam rentetan VendorFax;
}

awam VendorService () {

//Tanda komentar baris berikut jika menggunakan direka komponen
//InitializeComponent();
}

swasta Penjual[] GenerateTestVendors()
{
Penjual[] resultList;
resultList = baru Penjual[100];

Penjual v;
v = baru Penjual();
v.VendorAddress1 = "v1_address1";
v.VendorAddress2 = "v1_address2";
v.VendorCity = "v1_city";
v.VendorName = "v1_vendorname";
v.VendorPhone = "v1_vendorphone";
v.VendorState = "v1_st";
v.VendorType = "v1_type";
v.VendorZip = "v1_zip";

resultList[0] = v;

v = baru Penjual();

v.VendorAddress1 = "v2_address1";
v.VendorAddress2 = "v2_address2";
v.VendorCity = "v2_city";
v.VendorName = "v2_vendorname";
v.VendorPhone = "v2_vendorphone";
v.VendorState = "v2_st";
v.VendorType = "v2_type";
v.VendorZip = "v2_zip";

resultList[1] = v;

v = baru Penjual();
v.VendorAddress1 = "v3_address1";
v.VendorAddress2 = "v3_address2";
v.VendorCity = "v3_city";
v.VendorName = "v3_vendorname";
v.VendorPhone = "v3_vendorphone";
v.VendorState = "v3_st";
v.VendorType = "v3_type";
v.VendorZip = "v3_zip";

resultList[2] = v;

kembali resultList;

}

[WebMethod]
awam Penjual GetSpecificVendorById(int vendorId)
{
rentetan SpVendorSiteName; // Nama sebenar tapak MOSS yang menghoskan senarai tersuai Penjual.
rentetan SpVendorListName; // Nama sebenar MOSS senarai mengandungi vendor.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

menggunakan (SPSite lokasi = baru SPSite(SpVendorSiteName))
{

menggunakan (SPWeb web = halaman. OpenWeb())
{

SPList currentList = web. Senarai[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

kembali baru Penjual(specificItem);

} // menggunakan spweb web = site.openweb()
} // menggunakan laman web spsite = baru spsite("http://localhost/mizuho")

}

[WebMethod]
// Menganggap bahawa nama penjual adalah unik, daripada perspektif perniagaan
awam Penjual GetSpecificVendorByVendorName(rentetan vendorName)
{
rentetan SpVendorSiteName; // Nama sebenar tapak MOSS yang menghoskan senarai tersuai Penjual.
rentetan SpVendorListName; // Nama sebenar MOSS senarai mengandungi vendor.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

menggunakan (SPSite lokasi = baru SPSite(SpVendorSiteName))
{
menggunakan (SPWeb web = halaman. OpenWeb())
{

SPList currentList = web. Senarai[SpVendorListName];

foreach (SPItem vendorItem dalam currentList.Items)
{
jika (vendorItem["Nama penjual."] == Batal) terus;

jika (vendorItem["Nama penjual."].ToString().Adalah sama dengan(vendorName))
kembali baru Penjual(vendorItem);
}

Penjual v = baru Penjual();
v.VendorPhone = "tidak dijumpai: " + vendorName;

kembali v;

kembali Batal;

} // menggunakan spweb web = site.openweb()
} // menggunakan laman web spsite = baru spsite("http://localhost/mizuho")

} // kaedah

[WebMethod]
awam Penjual[] GetVendorsOfType (rentetan filterType)
{

rentetan SpVendorSiteName; // Nama sebenar tapak MOSS yang menghoskan t
Dia penjual senarai tersuai.
rentetan SpVendorListName; // Nama sebenar MOSS senarai mengandungi vendor.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

Penjual[] resultList;
int vendorIndex = 0;
resultList = baru Penjual[1000];

// Memulakan senarai dengan mesej mesra lalai.
Penjual v = baru Penjual();
v.VendorName = "Pilih jenis penjual untuk mengisi senarai ini.";
resultList[0] = v;

// Menukar penapis untuk kes yang lebih rendah untuk perbandingan rentetan mudah kemudian.
filterType = filterType.ToLower();

// Jika jenis penapis yang diluluskan adalah "ujian", menjana beberapa data yang mudah.
#rantau Penapis jenis = "menguji"
jika (filterType.Equals("ujian"))
kembali GenerateTestVendors();
#endregion

jika (benar)
{
menggunakan (SPSite lokasi = baru SPSite(SpVendorSiteName))
{
menggunakan (SPWeb web = halaman. OpenWeb())
{

v = Batal;

SPList currentList = web. Senarai[SpVendorListName];

// Iterate melalui semua item di dalam senarai pembekal.
foreach (SPItem vendorItem dalam currentList.Items)
{

rentetan lowerVendorType;

lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);

jika (lowerVendorType.Equals(filterType))
{
resultList[vendorIndex ] = baru Penjual(vendorItem);
}
} // iterating thru semua vendor dalam senarai


kembali TrimVendorArray(vendorIndex, resultList);
// kembali resultList;

} // menggunakan spweb web = site.openweb()
} // menggunakan laman web spsite = baru spsite("http://localhost/mizuho")

} // Jika benar

kembali Batal;
}

swasta Penjual[] TrimVendorArray(int newsize, Penjual[] originalVendorArray)
{
Penjual[] trimmedArray;

jika (newsize == 0) newsize = 1;
trimmedArray = baru Penjual[newsize];

int currentCounter = 0;

bagi (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

kembali trimmedArray;

}
}

MOSS: Pemerhatian di InfoPath penyahpepijatan

Mesej ralat pelayan InfoPath borang akan mengelirukan.

Semasa pembangunan satu bentuk InfoPath, Saya akan hantar ia ke pelayan MOSS dan mengakses borang. Borang akan mula untuk memuatkan dan kemudian menghasilkan mesej ralat yang mengelirukan menunjuk saya ke log peristiwa windows untuk maklumat lanjut. Malah, mesej ini ditulis untuk log peristiwa windows. Agak, mesej itu dihantar pada log diagnostik MOSS ascii. Anda boleh menjejaki yang melalui Perkhidmatan Pusat Pentadbiran.

Anda perlu cepat sampai di kaki anda. MOSS suka untuk menulis ke fail log, Soalan dan verbosely. Ini boleh dikurangkan tetapi log lalai yang menulis tingkah laku "segala-galanya secepat mungkin".

MOSS: Mengemaskini senarai tersuai

Terdapat banyak contoh baik mengemas kini senarai tersuai melalui SDK dalam. Inilah satu lagi.

Masalah perniagaan: Borang InfoPath telah direka yang membolehkan pengguna untuk memasukkan online membeli requisitions. Rekuisisi PO nombor perlu urutan tradisional berasaskan nilai-nilai integer dan dikira secara automatik.

Penyelesaian perniagaan yang: Mencipta senarai MOSS tersuai yang mengandungi kedua-dua Ruang: "ControlField" dan "ControlValue". Lajur nilai yang mengandungi jumlah permintaan pembelian seterusnya. Ambil perhatian bahawa generik "mengawal" konvensyen penamaan menyediakan bidang kawalan masa depan yang boleh digunakan apabila diperlukan.

Penyelesaian teknikal: Mewujudkan sebuah perkhidmatan web yang dilayari pelanggan InfoPath. Perkhidmatan web pulangan semula jumlah permintaan pembelian seterusnya dan mengemaskini nilai senarai.

Pengajaran yang dipelajari:

  • Apabila menambah perkhidmatan web ini sebagai sumber data untuk membentuk InfoPath, Saya mendapati ia perlu untuk mengubahnya menjadi sebuah udc dan menyimpannya ke dalam Perpustakaan sambungan data.
  • Saya juga mendapati ia perlu untuk membolehkan domain salib skrip melalui Perkhidmatan Pusat Pentadbiran // Pengurusan permohonan // Borang konfigurasi pelayan.
  • Pertama borang cuba untuk mengakses perkhidmatan web, Ia mengambil masa dan kadang-kadang, Ia akan keluar masa. Saya fiddled dengan seting dalam konfigurasi pelayan borang memperluaskan seting tamat dan yang seolah-olah membantu.

Kod:

menggunakan Sistem;
menggunakan System.Web;
menggunakan System.Web.Services;
menggunakan System.Web.Services.Protocols;
menggunakan Microsoft.SharePoint;
menggunakan System.Configuration;

[WebService(Ruang nama = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
awam kelas PoService : System.Web.Services.WebService
{
awam PoService () {

//Tanda komentar baris berikut jika menggunakan direka komponen
//InitializeComponent();
}

/// <Ringkasan>
/// Mendapatkan nombor PO seterusnya daripada senarai kawalan nombor sharepoint po.
/// Kenaikan jumlah PO dalam senarai itu.
/// </Ringkasan>
/// <pulangan yang></pulangan yang>
[WebMethod]
awam rentetan GetNextPoNumber()
{
rentetan SpPoControlSiteName; // Nama sebenar tapak MOSS yang menghoskan senarai kawalan PO.
rentetan SpPoControlListName; // Nama sebenar senarai MOSS yang mengandungi kawalan itu Po.

SpPoControlSiteName = ConfigurationSettings.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings["PoControlList"].ToString();

rentetan nextPoReqNumber = "xyzzy";

menggunakan (SPSite lokasi = baru SPSite(SpPoControlSiteName))
{
menggunakan (SPWeb web = halaman. OpenWeb())
{

SPList currentList = web. Senarai[SpPoControlListName];

foreach (SPItem controlItem dalam currentList.Items)
{

jika (((rentetan)controlItem["ControlField"]).Adalah sama dengan("NextPoNumber"))
{
nextPoReqNumber = (rentetan)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Menukar.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // Mengesan, membaca dan mengemaskini jumlah PO dalam senarai.


} // menggunakan spweb web = site.openweb()
} // menggunakan laman web spsite = baru spsite("http://localhost/mizuho")

kembali nextPoReqNumber;

}
}