MOSS / Bentuk InfoPath Server (InfoPath 2007) daftar drop-down kinerja

Kategori tambahan: InfoPath

Ringkasan: InfoPath 2007 Formulir dikirim ke MOSS server menyediakan daftar drop-down vendor yang terikat pada daftar MOSS kustom. Setelah memilih vendor, Peraturan menetapkan nilai bidang segenggam text Field seperti nama perwakilan penjualan, Alamat, Kota, negara, Zip dan telepon. Kinerja mengerikan. Kita perhatikan bahwa kinerja semakin buruk (secara non-linear) untuk setiap kolom tambahan kami memperbarui cara ini. Yaitu, Jika kita hanya memperbarui nama perwakilan penjualan, dibutuhkan [x] jumlah waktu. Jika kami memperbarui perwakilan penjualan, address1, address2, Kota, negara, Zip, dibutuhkan 10 kali lebih lama.

Solusi: Menulis layanan web (contoh kode dapat ditemukan Sini) yang disahkan dalam nama vendor dan kembali kembali rincian Penjual. Kemudian, menetapkan bidang cara ini. Walaupun ini tampak terlalu lambat, ada tidak ada perbedaan kinerja discernable ketika kami ditetapkan 1 bidang versus 8 bidang. Sebagai bonus tambahan, pengguna mendapatkan dingin "menghubungi server" Cylon Efek sementara mereka menunggu untuk formulir untuk memohon dan mengkonsumsi hasil Layanan.

MOSS: Pengecualian terjadi. (Pengecualian dari HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

UPDATE: Kami tidak pernah ditentukan akar penyebab masalah ini dan itu tidak pernah permukaan lagi.

Kita perhatikan selama pelaksanaan pengembangan situs yang tiba-tiba, dua pengguna tidak dapat mengakses situs koleksi. Account tersebut dapat mengotentikasi ke situs utama, Tapi ketika mencoba untuk mengakses koleksi situs tertentu, mereka hanya mendapatkan layar kosong. Tidak ada kesalahan yang ditampilkan, hanya sebuah halaman kosong putih.

Kita login sebagai admin koleksi situs dan mencoba untuk menambahkan satu dari para pengguna sebagai admin situs dan saat ini, Setelah menekan "OK", kita mendapatkan pesan ini:

Pengecualian terjadi. (Pengecualian dari HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Kami menghabiskan beberapa waktu untuk meneliti ini dan sayangnya, tidak datang dengan sesuatu yang berguna. Ada beberapa pesan dalam log diagnostik, tetapi sulit untuk persis berkorelasi dengan masalah ini.

Di ujung, kita menghapus situs koleksi dan kembali itu dan yang dipecahkan itu.

Jika saya mencari tahu apa yang menyebabkan ini di depan, Saya akan update posting ini.

MOSS: Iterasi melalui daftar kustom dan kembali data tertapis ke InfoPath

Bisnis skenario:

Menyediakan metode yang memungkinkan pengguna untuk memasukkan akurat pembelian requisitions cepat.

Masalah bisnis:

Klien yang melakukan bisnis dengan beberapa ratus vendor.

Vendor adalah "tipe" spesifik. Ini berarti bahwa vendor menjual peralatan komputer (misalnya. Dell) atau kantor (misalnya. Staples).

Bagaimana kami memungkinkan pengguna akhir yang membuat pembelian requisitions pilih vendor berlaku?

Solusi bisnis:

Membedakan vendor dalam sistem melalui "jenis".

Memungkinkan pengguna untuk memilih jenis"" produk dan kemudian memberikan serangkaian disaring sesuai vendor.

Solusi teknis:

Sebuah bentuk InfoPath telah dirancang dengan memungkinkan pengguna untuk memasukkan online membeli requisitions.

Dua InfoPath pilihan daftar kontrol vendor seleksi. Pertama, pengguna memilih "jenis pembelian". Hal ini membatasi daftar pilihan kedua berisi hanya vendor yang menjual untuk tipe pembelian. Ini adalah klasik cascading drop-down.

Vendor yang disimpan dalam daftar kustom MOSS dengan custom kolom untuk Penjual atribut seperti nama, Alamat dan terutama "jenis".

Melaksanakan layanan web untuk InfoPath klien untuk mengkonsumsi yang iterates melalui daftar kustom vendor, kembali hanya vendor pencocokan disediakan "jenis".

Memohon layanan web melalui formulir InfoPath.

Pelajaran:

  • Pertama, tampaknya diperlukan untuk pergi rute ini. Saya lebih suka untuk melakukan penyaringan sepenuhnya dalam InfoPath dan tidak membuat fungsi apapun di sini web layanan. Namun, bentuk server tidak menyediakan kemampuan penyaringan diperlukan. Kita dapat menempatkan aturan ke "jenis" Daftar pilihan formulir untuk semacam membuka kembali Penjual query, Tapi kita tidak bisa mendapatkannya bekerja dengan baik. Oleh karena itu, itu diperlukan untuk menerapkan layanan web.
  • Ini adalah klasik "cascading pilihan daftar" masalah di InfoPath membentuk dunia server dan ada banyak contoh baik di luar sana yang menjelaskan bagaimana untuk memecahkan masalah ini.
  • Nilai kosong untuk kolom dalam daftar vendor tidak mengembalikan string kosong ketika dirujuk seperti ini: initItem["Nama Penjual"]. Sebaliknya, mengembalikan null.

Pada beberapa catatan lain:

  • Saya mengembalikan array[] vendor karena saya punya beberapa kesulitan kembali ArrayList. InfoPath mengeluh tentang hal itu dan aku tidak punya waktu atau kemauan untuk melawan atasnya. Ini, Tentu saja, menempatkan batas buatan pada jumlah vendor. Ini juga memaksa saya untuk menerapkan trim() metode pada array karena aku benci gagasan kembali ke kembali 100 vendor null. InfoPath tidak peduli, Tapi itu merengek pada saya. (Lagi, ini adalah lebih mudah daripada memperebutkan InfoPath ArrayLists).
  • Saya menerapkan GetSpecificVendorByName() fungsi juga, yang mungkin instruktif.

Kode:

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

/// <Ringkasan>
///
Penjual Jasa: Menyediakan vendor terkait layanan yang saat ini dikonsumsi oleh sebuah bentuk infopath klien.
///
/// Sejarah:
/// ——–
/// 07/24/07: Awal coding, Paul J. Gavin dari Conchango.
///
/// </Ringkasan>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Umum kelas VendorService : System.Web.Services.WebService
{

/// <Ringkasan>
/// Mewakili vendor dari daftar kustom sharepoint dikelola oleh MSUSA.
/// </Ringkasan>
Umum kelas Penjual
{
Umum Penjual() { }

Umum Penjual(SPItem initItem)
{
Jika (! (initItem["Nama Penjual"] == null)) VendorName = initItem["Nama Penjual"].ToString();
Jika (! (initItem["Alamat 1"] == null)) VendorAddress1 = initItem["Alamat 1"].ToString();
Jika (! (initItem["Alamat 2"] == null)) VendorAddress2 = initItem["Alamat 2"].ToString();
Jika (! (initItem["City"] == null)) VendorCity = initItem["City"].ToString();
Jika (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Jika (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Jika (! (initItem["Negara"] == null)) VendorState = initItem["Negara"].ToString();
Jika (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Jika (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Jika (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // ID unik yang dipelihara melalui MOSS.
}

Umum Int VendorItemId;
Umum string VendorName;
Umum string VendorAddress1;
Umum string VendorAddress2;
Umum string VendorCity;
Umum string VendorState;
Umum string VendorZip;
Umum string VendorPhone;
Umum string VendorType;
Umum string VendorSalesRepName;
Umum string VendorFax;
}

Umum VendorService () {

//Tanda komentar baris berikut jika menggunakan dirancang 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]
Umum Penjual GetSpecificVendorById(Int vendorId)
{
string SpVendorSiteName; // Nama sebenarnya MOSS situs yang host daftar kustom vendor.
string SpVendorListName; // Nama daftar MOSS yang sebenarnya yang mengandung vendor.

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

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

menggunakan (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Daftar[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

kembali baru Penjual(specificItem);

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

}

[WebMethod]
// Mengasumsikan bahwa nama Penjual unik, dari perspektif bisnis
Umum Penjual GetSpecificVendorByVendorName(string menjadi)
{
string SpVendorSiteName; // Nama sebenarnya MOSS situs yang host daftar kustom vendor.
string SpVendorListName; // Nama daftar MOSS yang sebenarnya yang mengandung vendor.

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

menggunakan (SPSite situs = baru SPSite(SpVendorSiteName))
{
menggunakan (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Daftar[SpVendorListName];

foreach (SPItem vendorItem dalam currentList.Items)
{
Jika (vendorItem["Nama Penjual"] == null) «««;

Jika (vendorItem["Nama Penjual"].ToString().Sama dengan(menjadi))
kembali baru Penjual(vendorItem);
}

Penjual v = baru Penjual();
v.VendorPhone = "tidak ditemukan: " + menjadi;

kembali v;

kembali null;

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

} // metode

[WebMethod]
Umum Penjual[] GetVendorsOfType (string filterType)
{

string SpVendorSiteName; // Nama sebenarnya MOSS situs yang host t
Ia Penjual daftar kustom.
string SpVendorListName; // Nama daftar MOSS yang sebenarnya yang mengandung vendor.

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

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

// Menginisialisasi daftar dengan pesan default yang ramah.
Penjual v = baru Penjual();
v.VendorName = "Pilih jenis Penjual untuk mengisi daftar ini.";
resultList[0] = v;

// Mengubah filter untuk huruf untuk perbandingan string lebih mudah kemudian.
filterType = filterType.ToLower();

// Jika berlalu jenis penyaring adalah "test", menghasilkan beberapa data sederhana.
#wilayah Jenis penyaring = "test"
Jika (Sama filterType.("ujian"))
kembali GenerateTestVendors();
#endregion

Jika (benar)
{
menggunakan (SPSite situs = baru SPSite(SpVendorSiteName))
{
menggunakan (SPWeb Web = site. OpenWeb())
{

v = null;

SPList currentList = web. Daftar[SpVendorListName];

// Iterate melalui semua item dalam daftar vendor.
foreach (SPItem vendorItem dalam currentList.Items)
{

string lowerVendorType;

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

Jika (Sama lowerVendorType.(filterType))
{
resultList[vendorIndex ] = baru Penjual(vendorItem);
}
} // iterasi melalui semua vendor dalam daftar


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

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

} // Jika benar

kembali null;
}

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

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

Int currentCounter = 0;

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

kembali trimmedArray;

}
}

MOSS: Pengamatan pada InfoPath debugging

Pesan kesalahan server bentuk InfoPath menyesatkan.

Selama pengembangan InfoPath form, Saya akan posting ke MOSS server dan mengakses formulir. Bentuk akan mulai untuk memuat dan kemudian menghasilkan pesan kesalahan yang menyesatkan menunjuk saya ke windows event log untuk rincian. Sebenarnya, pesan tidak ditulis untuk log peristiwa windows. Agak, pesan dikirim ke log diagnostik MOSS ascii. Anda dapat melacak yang melalui pusat layanan administrasi.

Anda harus cepat di kaki Anda. MOSS suka menulis ke log file, sering dan verbosely. Ini dapat dipotong tetapi log default menulis perilaku "segalanya secepat mungkin".

MOSS: Memperbarui daftar kustom

Ada banyak contoh yang baik dari memperbarui daftar kustom melalui SDK. Di sini adalah lain.

Masalah bisnis: Bentuk InfoPath telah dirancang yang memungkinkan pengguna untuk memasukkan online membeli requisitions. PO permintaan nomor harus tradisional urutan berdasarkan nilai-nilai integer dan dihitung secara otomatis.

Solusi bisnis: Membuat daftar MOSS kustom yang mengandung dua kolom: "ControlField" dan "ControlValue". Nilai kolom berisi nomor permintaan pembelian berikutnya. Perhatikan bahwa generik "kontrol" Konvensi penamaan menyediakan untuk mengendalikan masa depan bidang yang dapat digunakan sebagai diperlukan.

Solusi teknis: Membuat layanan web diakses oleh klien InfoPath. Layanan web kembali kembali nomor permintaan pembelian berikutnya dan update nilai dari daftar.

Pelajaran:

  • Ketika menambahkan ini layanan web sebagai sumber data untuk bentuk InfoPath, Saya merasa perlu untuk mengubahnya menjadi udc dan menyimpannya ke Perpustakaan sambungan data.
  • Saya juga merasa perlu untuk mengaktifkan skrip lintas domain melalui layanan pusat administrasi // aplikasi manajemen // bentuk konfigurasi server.
  • Pertama kalinya bentuk mencoba untuk mengakses layanan web, Butuh waktu dan kadang-kadang, itu akan waktu. Saya fiddled dengan pengaturan dalam bentuk konfigurasi server untuk memperluas pengaturan timeout dan yang tampak untuk membantu.

Kode:

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

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

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

/// <Ringkasan>
/// Mendapatkan nomor PO berikutnya dari po nomor kontrol daftar sharepoint.
/// Kenaikan PO nomor dalam daftar itu.
/// </Ringkasan>
/// <kembali></kembali>
[WebMethod]
Umum string GetNextPoNumber()
{
string SpPoControlSiteName; // Nama sebenarnya MOSS situs yang host daftar kontrol PO.
string SpPoControlListName; // Nama daftar MOSS yang sebenarnya yang berisi kontrol Po.

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

string nextPoReqNumber = "xyzzy";

menggunakan (SPSite situs = baru SPSite(SpPoControlSiteName))
{
menggunakan (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Daftar[SpPoControlListName];

foreach (SPItem controlItem dalam currentList.Items)
{

Jika (((string)controlItem["ControlField"]).Sama dengan("NextPoNumber"))
{
nextPoReqNumber = (string)controlItem["ControlValue"];

Int int_nextPoReqNumber;
int_nextPoReqNumber = Mengkonversi.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Mencari, membaca dan memperbarui nomor PO dalam daftar.


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

kembali nextPoReqNumber;

}
}