Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-09-14

Погоняло


    А вон у того погоняло «Конюхов».
    А почему?
    Долго объяснять, но за водкой его лучше не посылать.

На днях столкнулся с чудесным.

Сижу, делаю очередную кнопку для ArcGIS Viewer for Silverlight, никого не трогаю. И вдруг, внезапно и без обьявления войны, отладка показывает, что в атрибутивной таблице рабочего слоя у выбранной записи нет ключа (ID)! В смысле, ключевое поле есть, стандартное для ArcGIS поле OBJECTID, а вот значения в нем нету. И ладно бы, если бы это был самопальный «левый» слой — нет, это вполне себе общедоступный, можно сказать эталонный слой с серверов ESRI (http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSPetro/MapServer/1).

Для тех кто не в теме, отсутствие ключа в таблице это смертный грех, карается незамедлительно расстрелом без суда и следствия. Да и работать ничего не будет, ибо это уже не таблица а просто кучка мусора.

Поскольку расстрелять владельцев таблицы у меня бы не получилось, я занялся следствием. Ибо мало ли, что показывает отладка, может сама таблица в порядке? И точно, в таблице все на месте, есть только маленькая неувязочка — ключевое поле, традиционно названное OBJECTID имеет нетрадиционный алиас «Object ID». Да, с пробелом. Какая фигня, скажете вы. И будете 100% правы. Кому какое дело, какой у поля алиас? Все равно эти алиасы используются только для подписей. И вот тут мы подходим к развязке сюжета.

В программе использовался код (написанный инженером ESRI, между прочим) наподобие такого

objectIDFieldName = selectedFeatureLayer.LayerInfo.ObjectIdField;
keyValue = selectedObj.Attributes[objectIDFieldName];

вполне себе тривиальный код, по имени поля из таблицы берется значение из выбранной записи. Все так делают.
Все да не все. Кто-то решил иначе. Кто-то (в рот ему ноги) решил, что в этом гребаном Аркгиссильверлайтвьювер алиас это не просто ценный мех значение из поля надо брать не по имени поля а по алиасу. И поскольку обычно у поля OBJECTID алиас тоже «OBJECTID», никто этой лажи не замечал. А тут вылезло — встретились два креативщика, один вписал необычный алиас к атрибуту, другой доступ к данным сделал через алиасы а не имена полей.

Короче, теперь код получения ID у выбранного обьекта выглядит приблизительно так
string objectIDFieldName = selectedFeatureLayer.LayerInfo.ObjectIdField;
string objectIDAlias = "";
var fields = selectedFeatureLayer.LayerInfo.Fields;
foreach(var f in fields) {
 if(f.Name == objectIDFieldName) {
  objectIDAlias = f.Alias;
  break;
 }
}
if(objectIDAlias != "") objectIDFieldName = objectIDAlias;
keyValue = selectedObj.Attributes[objectIDFieldName];

И вот в таком виде оно работает. Ужоснах.

Не забыть переделать все взад, когда ESRI исправит багу. Хотя, с их скоростями, к тому времени я точно забуду.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (185) web-develop (170) gov.ru (157) video (123) бытовуха (112) sysadm (100) GIS (97) Zope(Plone) (88) Book (81) programming (81) бурчалки (81) грабли (77) development (73) Fun (72) windsurfing (72) Microsoft (64) hiload (62) opensource (58) internet provider (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) language (45) hardware (44) JS (41) curse (40) driving (40) money (40) DBMS (38) bigdata (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) tourism (19) Apache (16) Manager (15) web-browser (15) Никонов (15) happiness (14) music (14) todo (14) PHP (13) course (13) functional programming (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) crypto (11) game (11) map (11) scala (11) HTTPD (9) ODF (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) Photo (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) display (4) holywar (4) nginx (4) pistol (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) USA (3) holiday (3) mount (3) spark (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) font (2) ftp (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Palanga (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) krusader (1) license (1) mindmap (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)

Google+ Followers