MOSS / Program InfoPath Forms Server (Program InfoPath 2007) Lista rozwijana wydajności

Dodatkową kategorię: Program InfoPath

Podsumowanie: Programu InfoPath 2007 formularza wdrożony na serwerze MOSS zawiera listę rozwijaną dostawców powiązana z listy niestandardowej MOSS. Po zaznaczeniu dostawcy, zasady przypisać wartości pola garstkę pola tekstowe, takie jak nazwa handlowy, adres, miasto, Państwo, zip i telefonu. Wydajność jest okropne. Zauważamy, że wydajność gets worse (w sposób liniowy) dla każdego pola dodatkowe aktualizowania w ten sposób. Tj, Jeśli mamy tylko zaktualizować nazwy handlowy, Trwa [x] czas. Jeśli musimy zaktualizować handlowy, Adres1, Adres2, miasto, Państwo, pocztowy, Trwa 10 razy dłużej.

Roztwór: Napisz usługi sieci web (Przykładowy kod można znaleźć tutaj) który jest przekazywany w imieniu dostawcy i ponownie zwraca dane dostawcy. Następnie, przypisać pola w ten sposób. Chociaż zbyt wydaje się wolno, nie było wyraźnej różnicy w wydajności możemy przypisany 1 pole kontra 8 pola. Dodatkowym atutem, użytkownicy otrzymują cool "kontaktowania się z serwerem" Kochał powstaje efekt, podczas gdy oni czekać na formularz, aby wywołać i zajmują usługi.

MOSS: Wystąpił wyjątek. (Wyjątek od HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

AKTUALIZACJA: Możemy nigdy ponownie określić główną przyczynę tego problemu oraz że nigdy nie powierzchni.

Zauważamy podczas wdrażania witryny rozwoju, że nagle, dwaj użytkownicy nie są w stanie uzyskać dostęp do zbioru witryn. Rachunki te mogą uwierzytelniać do strony głównej, Jednak przy próbie dostępu do konkretnej kolekcji witryn, one dostać pusty ekran. Nie błędów wyświetlane, biały pustej strony.

Możemy zalogować się jako administrator zbioru witryn i spróbować dodać jeden z tych użytkowników jako administratora witryny i tym razem, po naciśnięciu "OK", otrzymujemy tej wiadomości:

Wystąpił wyjątek. (Wyjątek od HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Spędziliśmy trochę czasu, to badania i Niestety, nie nadejdzie z czymkolwiek przydatne. Istniały pewne wiadomości w Dzienniku diagnostyczne, ale było trudno dokładnie skorelować je z tego problemu.

W końcu, możemy usunie zbiór witryn i ponownie utworzony i że rozwiązać.

Jeśli mogę wymyślić co spowodowało to w przyszłości, Zaktualizuję na stanowisku tym.

MOSS: Iteracja list niestandardowych i przekazujących dane filtrowane dane do programu InfoPath

Scenariusza biznesowego:

Zapewnia metodę, która umożliwia użytkownikom szybkie wpisywanie zapotrzebowań dokładne zakupu.

Problem w biznesie:

Klient prowadzi działalność w kilku dostawców kilkuset.

Dostawcy są "typ" szczególne. Oznacza to, że dostawca sprzedaje sprzęt komputerowy (np.. Firma Dell) lub materiały biurowe (np.. Zszywki).

Jak włączyć użytkowników końcowych, którzy tworzą zakupu zapotrzebowań Wybierz prawidłowy dostawcy możemy?

Rozwiązanie dla firm:

Rozróżnienie dostawców w systemie poprzez "typ".

Umożliwić użytkownikom wybieranie typu"" produktu i następnie odfiltrowany zestaw odpowiednich dostawców.

Rozwiązanie techniczne:

Formularz programu InfoPath został zaprojektowany pozwala użytkownikom wprowadzać w trybie online kupić zapotrzebowań.

Dwie listy wyboru program InfoPath kontroli wybór dostawcy. Pierwszy, użytkownik wybierze opcję „typu zakupu". Ogranicza to drugi list wyboru zawiera tylko dostawców, które sprzedają tego typu zakupu. Jest to klasyczny kaskadowych drop niedziałający.

Dostawców są przechowywane w MOSS niestandardową listę z kolumn niestandardowych dla dostawcy atrybutów, takich jak nazwa, adres i szczególnie "typ".

Wdrożenie usługi sieci web dla klienta programu InfoPath do spożywania że iterację na liście niestandardowe dostawcy, zwracanie tylko dostawców dopasowania dostarczony "typ".

Wywołania usługi sieci web za pośrednictwem formularza programu InfoPath.

Wyciągnięte wnioski:

  • Pierwszy, wydaje się konieczne do tej trasy. I wolałaby filtrowanie całkowicie programu InfoPath i nie stwarzają żadnych sieci web usługi funkcji tutaj. Jednakże, Forms server nie dostarcza wymaganych zdolności filtrowania. Możemy zjednoczyć regułę na typ"" listy wyboru w formularzu sort of ponowne otwarcie kwerendy dostawcy, ale nie otrzymujemy by działał poprawnie. W związku z tym, był wdrożenia usługi sieci web.
  • Jest to klasyczna "kaskadowych listy wyboru" problem w programie InfoPath formularzy serwera świata i istnieje wiele dobrych przykładów tam które wyjaśniają, jak rozwiązać ten.
  • Wartość pustej kolumny na liście dostawcy nie zwraca ciąg pusty, gdy odwołanie do tak: initItem["Nazwa dostawcy"]. Zamiast tego, Zwraca wartość null.

Niektóre inne uwagi:

  • I zwracają tablicę[] dostawców ponieważ miałem trudności zwracanie obiektu ArrayList. Program InfoPath był skarżą go i nie mam czasu lub nachylenie do walki nad nim. To, Oczywiście, umieszcza sztucznego ograniczenia całkowitej liczby dostawców. On także zmuszony mnie do wdrożenia trim() Metoda na tablicy bo nienawidzę pomysł powrotu powrót 100 dostawców wartości null. Program InfoPath nie opieki, ale nagged na mnie. (Ponownie, to było łatwiejsze niż zwalczanie InfoPath nad ArrayLists).
  • I wdrożone GetSpecificVendorByName() Funkcja także, który może być pouczający.

Kod:

przy użyciu Systemu;
przy użyciu System.Web;
przy użyciu System.Web.Services;
przy użyciu System.Web.Services.Protocols;
przy użyciu Microsoft.SharePoint;
przy użyciu System.Configuration;

/// <Podsumowanie>
///
Dostawcy usług: Zapewnia, że dostawcy związane z usług, które dziś są spożywane przez klienta formularza programu infopath.
///
/// Historia:
/// ——–
/// 07/24/07: Początkowe kodowania, Paul J. Gavin Conchango.
///
/// </Podsumowanie>
[Usługi WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publiczne Klasa VendorService : System.Web.Services.Usługi WebService
{

/// <Podsumowanie>
/// Reprezentuje dostawcy z listy programu sharepoint niestandardowych utrzymywana przez MSUSA.
/// </Podsumowanie>
publiczne Klasa Dostawcy
{
publiczne Dostawcy() { }

publiczne Dostawcy(SPItem initItem)
{
Jeśli (! (initItem["Nazwa dostawcy"] == pusty)) VendorName = initItem["Nazwa dostawcy"].ToString();
Jeśli (! (initItem["Adres 1"] == pusty)) VendorAddress1 = initItem["Adres 1"].ToString();
Jeśli (! (initItem["Adres 2"] == pusty)) VendorAddress2 = initItem["Adres 2"].ToString();
Jeśli (! (initItem["City"] == pusty)) VendorCity = initItem["City"].ToString();
Jeśli (! (initItem["VendorPhone"] == pusty)) VendorPhone = initItem["VendorPhone"].ToString();
Jeśli (! (initItem["PurchaseType"] == pusty)) VendorType = initItem["PurchaseType"].ToString();
Jeśli (! (initItem["Państwo"] == pusty)) VendorState = initItem["Państwo"].ToString();
Jeśli (! (initItem["Zip"] == pusty)) VendorZip = initItem["Zip"].ToString();
Jeśli (!(initItem["Faksu"] == pusty)) VendorFax = initItem["Faksu"].ToString();
Jeśli (!(initItem["SalesRepName"] == pusty)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unikatowy identyfikator utrzymywane przez MOSS.
}

publiczne int VendorItemId;
publiczne ciąg VendorName;
publiczne ciąg VendorAddress1;
publiczne ciąg VendorAddress2;
publiczne ciąg VendorCity;
publiczne ciąg VendorState;
publiczne ciąg VendorZip;
publiczne ciąg VendorPhone;
publiczne ciąg VendorType;
publiczne ciąg VendorSalesRepName;
publiczne ciąg VendorFax;
}

publiczne VendorService () {

//Usuń oznaczenie komentarza że następujący wiersz, jeśli za pomocą zaprojektowane komponenty
//InitializeComponent();
}

prywatne Dostawcy[] GenerateTestVendors()
{
Dostawcy[] Rankingu;
Rankingu = Nowy Dostawcy[100];

Dostawcy v;
v = Nowy Dostawcy();
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";

Rankingu[0] = v;

v = Nowy Dostawcy();

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

Rankingu[1] = v;

v = Nowy Dostawcy();
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";

Rankingu[2] = v;

Powrót Rankingu;

}

[WebMethod]
publiczne Dostawcy GetSpecificVendorById(int Identyfikator dostawcy)
{
ciąg SpVendorSiteName; // Nazwa rzeczywistej witryny MOSS, obsługującym listy niestandardowych dostawców.
ciąg SpVendorListName; // Nazwa aktualnej liście mech zawierające dostawców.

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

przy użyciu (SPSite Strona = Nowy SPSite(SpVendorSiteName))
{

przy użyciu (Sieci Web programu SharePoint Web = site. OpenWeb())
{

SPList currentList = www. Wyświetla listę[SpVendorListName];

SPItem specificItem = currentList.Items[Identyfikator dostawcy];

Powrót Nowy Dostawcy(specificItem);

} // za pomocą spweb web = site.openweb()
} // za pomocą Strona spsite = new spsite("http://localhost/mizuho")

}

[WebMethod]
// Zakłada się, że nazwa dostawcy jest niepowtarzalny, z punktu widzenia przedsiębiorców
publiczne Dostawcy GetSpecificVendorByVendorName(ciąg NazwaDostawcy)
{
ciąg SpVendorSiteName; // Nazwa rzeczywistej witryny MOSS, obsługującym listy niestandardowych dostawców.
ciąg SpVendorListName; // Nazwa aktualnej liście mech zawierające dostawców.

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

przy użyciu (SPSite Strona = Nowy SPSite(SpVendorSiteName))
{
przy użyciu (Sieci Web programu SharePoint Web = site. OpenWeb())
{

SPList currentList = www. Wyświetla listę[SpVendorListName];

foreach (SPItem vendorItem w currentList.Items)
{
Jeśli (vendorItem["Nazwa dostawcy"] == pusty) w dalszym ciągu;

Jeśli (vendorItem["Nazwa dostawcy"].ToString().Równa się(NazwaDostawcy))
Powrót Nowy Dostawcy(vendorItem);
}

Dostawcy v = Nowy Dostawcy();
v.VendorPhone = "nie znaleziono: " + NazwaDostawcy;

Powrót v;

Powrót pusty;

} // za pomocą spweb web = site.openweb()
} // za pomocą Strona spsite = new spsite("http://localhost/mizuho")

} // Metoda

[WebMethod]
publiczne Dostawcy[] GetVendorsOfType (ciąg filterType)
{

ciąg SpVendorSiteName; // Nazwa rzeczywistej witryny MOSS, obsługującego t
sam sprzedawca listy niestandardowej.
ciąg SpVendorListName; // Nazwa aktualnej liście mech zawierające dostawców.

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

Dostawcy[] Rankingu;
int vendorIndex = 0;
Rankingu = Nowy Dostawcy[1000];

// Zainicjować listy z domyślną przyjacielski przekaz.
Dostawcy v = Nowy Dostawcy();
v.VendorName = "Wybierz typ dostawcy do wypełnienia tej listy.";
Rankingu[0] = v;

// Przekonwertować filtr litery na łatwiejsze porównanie string później.
filterType = filterType.ToLower();

// Jeśli typ filtru przekazywana jest "test", generować kilka prostych danych.
#w regionie Filtr typu = "test"
Jeśli (równa się filterType.("badanie"))
Powrót GenerateTestVendors();
#endregion

Jeśli (PRAWDA)
{
przy użyciu (SPSite Strona = Nowy SPSite(SpVendorSiteName))
{
przy użyciu (Sieci Web programu SharePoint Web = site. OpenWeb())
{

v = pusty;

SPList currentList = www. Wyświetla listę[SpVendorListName];

// Iterację wszystkich elementów na liście dostawców.
foreach (SPItem vendorItem w currentList.Items)
{

ciąg lowerVendorType;

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

Jeśli (Równa się lowerVendorType.(filterType))
{
Rankingu[vendorIndex ] = Nowy Dostawcy(vendorItem);
}
} // Iterowanie poprzez wszystkie dostawcy na liście


Powrót TrimVendorArray(vendorIndex, Rankingu);
// powrót rankingu;

} // za pomocą spweb web = site.openweb()
} // za pomocą Strona spsite = new spsite("http://localhost/mizuho")

} // Jeśli to prawda

Powrót pusty;
}

prywatne Dostawcy[] TrimVendorArray(int newsize, Dostawcy[] originalVendorArray)
{
Dostawcy[] trimmedArray;

Jeśli (NewSize == 0) NewSize = 1;
trimmedArray = Nowy Dostawcy[newsize];

int currentCounter = 0;

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

Powrót trimmedArray;

}
}

MOSS: Uwagi na temat programu InfoPath debugowania

Program InfoPath formularz server komunikaty o błędach są mylące.

Podczas projektowania formularza programu InfoPath, Będzie post do serwera MOSS i dostęp do formularza. Formie zaczną się załadować, a następnie wygenerować mylący komunikat o błędzie wskazujący mnie do dziennika zdarzeń systemu windows, aby uzyskać szczegółowe informacje. W zasadzie, wiadomość nie została napisana w dzienniku zdarzeń systemu windows. Raczej, wiadomość została wysłana do dziennika diagnostycznego MOSS ascii. Można wytropić, za pośrednictwem centrum usług administracji.

Musisz być szybki w nogach. Mech lubi pisać do pliku dziennika, często i obszernie. To może być przycinana ale domyślnym dzienniku pisze zachowanie jest "wszystko tak szybko jak to możliwe".

MOSS: Aktualizacja listy niestandardowej

Istnieje wiele dobrych przykładów aktualizacji list niestandardowych za pomocą zestawu SDK. Oto kolejny.

Problem w biznesie: Formularz programu InfoPath został zaprojektowany, że umożliwia użytkownikom wprowadzanie online zapotrzebowania na zakup. PO rekwizycji, że numery powinny być tradycyjne sekwencji na bazie wartości całkowitych i obliczane automatycznie.

Rozwiązanie dla firm: Utworzyć niestandardową listę MOSS zawierającej dwie kolumny: "ControlField" i "ControlValue". Wartość kolumna zawiera numer kolejny zapotrzebowania zakupu. Należy pamiętać, że nazwę rodzajową "kontrola" Konwencja nazewnictwa przewiduje przyszłość kontroli pola, które mogą być stosowane w razie potrzeby.

Rozwiązanie techniczne: Tworzenie usługa sieci web dostęp do klienta programu InfoPath. Usługa sieci web zwraca następny numer zapotrzebowania zakupu i aktualizuje wartości listy.

Wyciągnięte wnioski:

  • Podczas dodawania tej usługi sieci web jako źródło danych do formularza programu InfoPath, I stwierdziła, że trzeba go przerobic udc i przechowywać go w bibliotece połączeń danych.
  • Również znaleźć niezbędne do umożliwienia granic domen skryptów za pomocą administracji centralnej usługi // Zarządzanie aplikacjami // Konfiguracja serwera w postaci.
  • Po raz pierwszy formie próbował uzyskać dostęp do usługa sieci web, to zajmuje trochę czasu, a przy okazji, to czas. Bawił się z ustawienia w formularzu konfiguracja serwera, aby rozwiń ustawienia limitu czasu i wydawało się pomóc.

Kod:

przy użyciu Systemu;
przy użyciu System.Web;
przy użyciu System.Web.Services;
przy użyciu System.Web.Services.Protocols;
przy użyciu Microsoft.SharePoint;
przy użyciu System.Configuration;

[Usługi WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publiczne Klasa PoService : System.Web.Services.Usługi WebService
{
publiczne PoService () {

//Usuń oznaczenie komentarza że następujący wiersz, jeśli za pomocą zaprojektowane komponenty
//InitializeComponent();
}

/// <Podsumowanie>
/// Uzyskać następny numer zamówienia z listy programu sharepoint po numer kontroli.
/// Zwiększajšć liczbę PO tej liście.
/// </Podsumowanie>
/// <zwraca></zwraca>
[WebMethod]
publiczne ciąg GetNextPoNumber()
{
ciąg SpPoControlSiteName; // Nazwa rzeczywistej witryny MOSS, obsługującego listę PO kontroli.
ciąg SpPoControlListName; // Nazwa aktualnej liście mech zawierające Po kontroli.

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

ciąg nextPoReqNumber = "xyzzy";

przy użyciu (SPSite Strona = Nowy SPSite(SpPoControlSiteName))
{
przy użyciu (Sieci Web programu SharePoint Web = site. OpenWeb())
{

SPList currentList = www. Wyświetla listę[SpPoControlListName];

foreach (SPItem controlItem w currentList.Items)
{

Jeśli (((ciąg)controlItem["ControlField"]).Równa się("NextPoNumber"))
{
nextPoReqNumber = (ciąg)controlItem["ControlValue"];

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

int_nextPoReqNumber ;

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

} // Lokalizowanie, czytanie i aktualizowania PO numer z listy.


} // za pomocą spweb web = site.openweb()
} // za pomocą Strona spsite = new spsite("http://localhost/mizuho")

Powrót nextPoReqNumber;

}
}