YOSUN / InfoPath Forms Server (InfoPath 2007) aşağı açılan liste performansı

Ek Kategori: InfoPath

Özet: InfoPath 2007 MOSS sunucuya dağıtmak için form özel yosun listeye bağlı satıcılar aþaðý açýlan listesini sağlar. Satıcı seçme üzerine, kurallar, metin alanları satış temsilcisi adı gibi bir avuç alan değerlerini atayın., Adres, Şehir, Devlet, zip ve telefon. Performans korkunç. Biz fark performans kötüleşiyor (Doğrusal olmayan bir biçimde) her ek alan için biz bu şekilde güncelleyin.. Yani, Eğer sadece satış temsilcisi adı güncelleştirin, o alır [x] bir süre. Satış temsilcisi güncelleştirirseniz, Adres1, Adres2, Şehir, Devlet, ZIP, o alır 10 kat uzun.

Çözüm: Bir web servisi yazma (örnek kodu bulabilirsiniz Burada) bir satıcı adına geçti ve satıcı tafsilât geri döndürür. O zaman, Bu şekilde alanları atama. Bu da görünse de yavaş, Biz atanmış hiçbir discernable fark performans vardı 1 alan karşı 8 alanları. Ek olarak, kullanıcılar "sunucusuna bağlanılıyor serin olsun" Cylon formu çağırmak ve hizmet sonuçları beklerken etkisi.

YOSUN: Özel durum oluştu. (HRESULT özel durum: 0x 80020009 (DISP_E_EXCEPTION))

GÜNCELLEŞTİRME: Tekrar bu sorunu ve bu asla yüzey kök neden hiç düşünmedik.

Biz geliştirme site uygulanması sırasında o aniden fark, iki kullanıcı bir site koleksiyonu erişemiyor. Bu hesapları ana siteye kimlik doğrulaması yapabilir, Ama belirli site koleksiyonu erişmeye çalışırken, Onlar sadece boş bir ekran olsun. Görüntülenen hata, Sadece boş bir beyaz sayfa.

Bir site koleksiyonu yönetici oturum açın ve bu kullanıcıların site admin ve bu sefer ekleyin çalışın, "Tamam" tuşuna basarak üzerine, Bu mesajı alır:

Özel durum oluştu. (HRESULT özel durum: 0x 80020009 (DISP_E_EXCEPTION))

Bu araştırma biraz zaman geçirdim ve ne yazık ki, işe yarar bir şey çıkmadı. Tanılama günlüğüne bazı mesajları vardı., Ama tam olarak onlara bu konuyla ilişkilendirmek zordu.

Sonunda, Biz site koleksiyonunun silinmesi ve yeniden oluşturulması ve çözüldü.

Eğer ı biçim ne gelecekte bunun nedeni, Bu posta güncelleriz.

YOSUN: Özel listeler aracılığıyla yineleme ve InfoPath için süzülmüş veri döndürme

İş senaryosu:

Hızlı bir şekilde doğru satınalma talepleri kullanıcılarının kullanmasına izin veren bir yöntem sağlamak.

İş sorunu:

İstemci iş ile birkaç yüz satıcı yapar..

Satıcılar "türü vardır." belirli. Bu, bir satıcı bilgisayar ekipmanı satan anlamına gelir (e.g. Dell) veya büro malzemeleri (e.g. Zımba).

Nasıl satın alma talepleri basıp geçerli satıcı oluşturun kullanıcıların etkinleştirebilirim?

İş çözümü:

"Type" yolu ile sistem satıcıları ayırt.

Kullanıcıların "türü seçmek için" ürün ve uygun satıcıları filtre uygulanan bir dizi sağlar.

Teknik çözüm:

InfoPath formu online girmek için olanaklı kılmak kullanıcı talepleri satın tasarlanmıştır.

İki InfoPath seçim listesi Tedarikçi seçimi denetlemek. İlk, "satınalma tipi" kullanıcı seçer. Bu sınırlar yalnızca Satınalma türü için satmak satıcıları içeren ikinci bir seçim listesi. Bu bir klasik basamaklı açılır olduğunu.

MOSS özel listesi olan özel sütun adı gibi öznitelikleri satıcı için Satıcılar depolanır, Adres ve özellikle "türü".

Uygulama bir web hizmeti için bu kullanmak bir InfoPath istemcisi özel satıcı listesi sırayla dolaşır., verilen bir "tip" eşleştirme yalnızca satıcılar döndürülüyor.

InfoPath formu aracılığıyla web hizmetini çağırmak.

Öğrenilen dersler:

  • İlk, Bu rota gitmek için gerekli gibi görünüyor. Ben tamamen InfoPath içinde filtreleme yapmak ve herhangi bir web hizmeti işlevselliği burada değil oluşturmak tercih ederdim. Ancak, Formlar Sunucusu gerekli filtreleme yeteneği sağlamaz.. Bir kural üzerine koyabilirsiniz bir "türü" seçim listesi formunda, bir nevi satıcı sorguyu yeniden açın, Ama biz cant'almak o doğru çalışması için. Bu nedenle, web hizmeti uygulaması için gerekli.
  • Bu klasik "basamaklama seçimi listesidir" InfoPath uygulamasında sorun server dünya oluşturur ve bunu çözmek nasıl açıklayan birçok iyi örnekler var.
  • Satıcı listesindeki bir sütun için boş bir değer boş bir dize bu şekilde başvurulan döndürmüyor: initItem["Satıcı adı"]. Bunun yerine, bir null döndürüyor.

Diğer bazı notlar:

  • Bir dizi döndürür[] satıcıların bir ArrayList dönen bazı zorluk vardı çünkü. InfoPath bu konuda şikayetçi olduğunu ve zaman ya da eğim üzerine kavga yoktu. Bu, Elbette, Satıcı sayısı yapay bir sınır koyar. Ayrıca bana bir trim uygulamaya mecbur() yöntemi dizi üzerinde dönen üzülürüm çünkü geri 100 ün boş satıcıların. InfoPath umurunda değil, Ama bana nagged. (Tekrar, Bu ArrayLists üzerinde InfoPath mücadele daha kolaydı).
  • Bir GetSpecificVendorByName uygulanan() işlev de, hangi-ebilmek var olmak eğitici.

Kodu:

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

/// <Özet>
///
Satıcı hizmeti: Bugün InfoPath istemci formu tarafından tüketilmesi ile ilgili satıcı hizmetleri sağlar.
///
/// Geçmiş:
/// ——–
/// 07/24/07: İlk kodlama, Paul J. Gavin Conchango.
///
/// </Özet>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Genel sınıf VendorService : System.Web.Services.WebService
{

/// <Özet>
/// MSUSA tarafından tutulan özel sharepoint listesinden bir satıcı temsil eder.
/// </Özet>
Genel sınıf Satıcı
{
Genel Satıcı() { }

Genel Satıcı(SPItem initItem)
{
Eğer (! (initItem["Satıcı adı"] == NULL)) SatıcıAdı initItem =["Satıcı adı"].ToString();
Eğer (! (initItem["Adres 1"] == NULL)) VendorAddress1 initItem =["Adres 1"].ToString();
Eğer (! (initItem["Adres 2"] == NULL)) VendorAddress2 initItem =["Adres 2"].ToString();
Eğer (! (initItem["City"] == NULL)) VendorCity initItem =["City"].ToString();
Eğer (! (initItem["VendorPhone"] == NULL)) VendorPhone initItem =["VendorPhone"].ToString();
Eğer (! (initItem["PurchaseType"] == NULL)) VendorType initItem =["PurchaseType"].ToString();
Eğer (! (initItem["Devlet"] == NULL)) VendorState initItem =["Devlet"].ToString();
Eğer (! (initItem["ZIP"] == NULL)) VendorZip initItem =["ZIP"].ToString();
Eğer (!(initItem["Faks"] == NULL)) VendorFax initItem =["Faks"].ToString();
Eğer (!(initItem["SalesRepName"] == NULL)) VendorSalesRepName initItem =["SalesRepName"].ToString();

VendorItemId initItem.ID =; // MOSS ile tutulan benzersiz kimliği.
}

Genel int VendorItemId;
Genel dize SatıcıAdı;
Genel dize VendorAddress1;
Genel dize VendorAddress2;
Genel dize VendorCity;
Genel dize VendorState;
Genel dize VendorZip;
Genel dize VendorPhone;
Genel dize VendorType;
Genel dize VendorSalesRepName;
Genel dize VendorFax;
}

Genel VendorService () {

//Eğer istimal ertesi gün içini kaplamak bileşenleri tasarlanmış uncomment
//InitializeComponent();
}

Özel Satıcı[] GenerateTestVendors()
{
Satıcı[] resultList;
resultList = Yeni Satıcı[100];

Satıcı v;
v = Yeni Satıcı();
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 = Yeni Satıcı();

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 = Yeni Satıcı();
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 =;

geri dönmek resultList;

}

[WebMethod]
Genel Satıcı GetSpecificVendorById(int VendorID)
{
dize SpVendorSiteName; // Satıcı özel liste ev sahipliği yapan gerçek MOSS sitenin adı.
dize SpVendorListName; // Listenin adı satıcıları içeren gerçek MOSS.

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

kullanma (SPSite Site = Yeni SPSite(SpVendorSiteName))
{

kullanma (SPWeb Web sitesi =. OpenWeb())
{

SPList.Update() currentList web =. Listeler[SpVendorListName];

SPItem specificItem currentList.Items =[VendorID];

geri dönmek Yeni Satıcı(specificItem);

} // SPWeb web kullanarak site.openweb =()
} // SPSite sitesini kullanarak yeni spsite =("http://localhost/mizuho")

}

[WebMethod]
// Satıcı adı benzersiz olduğunu varsayar., bir işletme açısından
Genel Satıcı GetSpecificVendorByVendorName(dize olmak)
{
dize SpVendorSiteName; // Satıcı özel liste ev sahipliği yapan gerçek MOSS sitenin adı.
dize SpVendorListName; // Listenin adı satıcıları içeren gerçek MOSS.

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

kullanma (SPSite Site = Yeni SPSite(SpVendorSiteName))
{
kullanma (SPWeb Web sitesi =. OpenWeb())
{

SPList.Update() currentList web =. Listeler[SpVendorListName];

foreach (SPItem vendorItem içinde currentList.Items)
{
Eğer (vendorItem["Satıcı adı"] == NULL) devam etmek;

Eğer (vendorItem["Satıcı adı"].ToString().Eşittir(olmak))
geri dönmek Yeni Satıcı(vendorItem);
}

Satıcı v = Yeni Satıcı();
v.VendorPhone = "bulunamadı: " + olmak;

geri dönmek v;

geri dönmek NULL;

} // SPWeb web kullanarak site.openweb =()
} // SPSite sitesini kullanarak yeni spsite =("http://localhost/mizuho")

} // yöntemi

[WebMethod]
Genel Satıcı[] GetVendorsOfType (dize filterType)
{

dize SpVendorSiteName; // T ev sahipliği yapan gerçek MOSS sitenin adı
o satıcı özel liste.
dize SpVendorListName; // Listenin adı satıcıları içeren gerçek MOSS.

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

Satıcı[] resultList;
int vendorIndex = 0;
resultList = Yeni Satıcı[1000];

// Varsayılan bir dostu ileti listesiyle başlatılamıyor.
Satıcı v = Yeni Satıcı();
v.VendorName = "Bu liste doldurmak için bir satıcı türünü seçin.";
resultList[0] v =;

// Daha sonra daha kolay dize karşılaştırma için daha düşük bir durum için filtre dönüştürmek.
filterType filterType.ToLower =();

// Filtre türü geçti ise, "test", bazı basit veri oluşturmak.
#Bölge Filtre türü "test ="
Eğer (filterType. eşittir("testi"))
geri dönmek GenerateTestVendors();
#endregion

Eğer (TRUE)
{
kullanma (SPSite Site = Yeni SPSite(SpVendorSiteName))
{
kullanma (SPWeb Web sitesi =. OpenWeb())
{

v = NULL;

SPList.Update() currentList web =. Listeler[SpVendorListName];

// Satıcı listedeki tüm öğeleri arasında yineleme.
foreach (SPItem vendorItem içinde currentList.Items)
{

dize lowerVendorType;

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

Eğer (Eşittir lowerVendorType.(filterType))
{
resultList[vendorIndex ] = Yeni Satıcı(vendorItem);
}
} // Listedeki tüm satıcılar aracılığıyla yineleme


geri dönmek TrimVendorArray(vendorIndex, resultList);
// resultList dönmek;

} // SPWeb web kullanarak site.openweb =()
} // SPSite sitesini kullanarak yeni spsite =("http://localhost/mizuho")

} // TRUE ise

geri dönmek NULL;
}

Özel Satıcı[] TrimVendorArray(int newsize, Satıcı[] originalVendorArray)
{
Satıcı[] trimmedArray;

Eğer (newsize == 0) newsize = 1;
trimmedArray = Yeni Satıcı[newsize];

int currentCounter = 0;

için (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] originalVendorArray =[currentCounter];
}

geri dönmek trimmedArray;

}
}

YOSUN: InfoPath hata ayıklama gözlem

InfoPath formu sunucu hata iletileri yanıltıcı.

InfoPath formu gelişimi sırasında, MOSS sunucuya göndermek ve forma ulaşmak istiyorum. Form yükleme ve ayrıntılı bilgi için windows olay günlüğüne bana işaret yanıltıcı bir hata iletisi oluşturmak başlamak istiyorum. Aslında, hiçbir mesaj windows olay günlüğüne yazılan. Daha doğrusu, MOSS ASCII tanılama günlüğüne ileti gönderildi. Bunun üzerinden Merkezi Hizmetler Yönetim izleyebilirsiniz.

Ayaklarının üstünde hızlı olmak gerekir. MOSS günlük dosyasına yazmak seviyor., sık sık ve verbosely. Bu-var olmak süs ama davranış yazma varsayılan günlük olduğu "her şey mümkün olan en kısa sürede".

YOSUN: Özel bir liste güncelleştiriliyor

Orada birçok iyi örnek SDK ile özel listeleri güncelleme. İşte yeni bir.

İş sorunu: InfoPath formu online girmek için olanaklı kılmak kullanıcı talepleri satın tasarlanmıştır. PO sayı-meli var olmak geleneksel sıra talep tamsayı değerlerine dayalı ve otomatik olarak hesaplanan.

İş çözümü: İki sütun içeren özel bir yosun liste oluşturma: "ControlField" ve "ControlValue". Değer sütununda sonraki satın alma talep numarası içerir. Genel "kontrol unutmayın" gerektiğinde kullanılabilir gelecekteki denetim alanları için adlandırma kuralı sağlar.

Teknik çözüm: InfoPath istemci tarafından erişilen bir web servisi yaratmak. Web hizmeti bir sonraki satın alma talep numarası geri döndürür ve liste değerini güncelleştirir.

Öğrenilen dersler:

  • Bu web hizmeti veri kaynağı olarak InfoPath formu ekleyerek., Udc için dönüştürmek ve bir veri bağlantısı kitaplığında depolamak gerekli buldum.
  • Ayrıca üzerinden Merkezi Hizmetler Yönetim etki alanları arası komut dosyası çalıştırma etkinleştirmek gerekli bulundu // Uygulama Yönetimi // Form sunucu yapılandırması.
  • Formu web hizmetine erişmek için çalıştı ilk kez, bir süre alır ve zaman zaman, o zaman dışarı istiyorsunuz. Zaman aşımı ayarları'nı form sunucu yapılandırma ayarları ile oynuyordu ve yardımcı olacak gibiydi.

Kodu:

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

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Genel sınıf PoService : System.Web.Services.WebService
{
Genel PoService () {

//Eğer istimal ertesi gün içini kaplamak bileşenleri tasarlanmış uncomment
//InitializeComponent();
}

/// <Özet>
/// Sonraki PO numarası sharepoint po numarası kontrol listesi elde.
/// Bu listede artışı PO numarası.
/// </Özet>
/// <döndürür></döndürür>
[WebMethod]
Genel dize GetNextPoNumber()
{
dize SpPoControlSiteName; // PO denetim listesi ev sahipliği yapan gerçek MOSS sitenin adı.
dize SpPoControlListName; // Po denetimi içeren gerçek MOSS listesi adı.

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

dize nextPoReqNumber = "xyzzy";

kullanma (SPSite Site = Yeni SPSite(SpPoControlSiteName))
{
kullanma (SPWeb Web sitesi =. OpenWeb())
{

SPList.Update() currentList web =. Listeler[SpPoControlListName];

foreach (SPItem controlItem içinde currentList.Items)
{

Eğer (((dize)controlItem["ControlField"]).Eşittir("NextPoNumber"))
{
nextPoReqNumber = (dize)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Dönüştürme.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Bulma, okuma ve listedeki PO numarası güncelleştirme.


} // SPWeb web kullanarak site.openweb =()
} // SPSite sitesini kullanarak yeni spsite =("http://localhost/mizuho")

geri dönmek nextPoReqNumber;

}
}