seajey: Electronic Knight (Default)
В офисе остался последний пакетик чая. Сначала его заваривает директор, у него gfrtnbr перехватывает бухгалтер, ну а простым сотрудникам остаётся довольствоваться третим и последующим отжимами...

А я вот себе заварил чайничек крупнолистового, с доброй ложкой аптечного шалфея :)
seajey: Electronic Knight (Default)
Есть у нас хороший клиент, активных пользователь БизнесМенеджерАгро - основного продукта enterprice-части Wilmark'а. Сейчас у них, в связи с объединением с другой компанией, тоже нашего клиента, кстати, большие пертурбации, в том числе и со стандартом отчётности. В процессе перехода к новому формату они заказали нам серию отчётов на начисление различных расходов. Среди них есть отчёт, выдающий расчётные тарифы на перевозку ж/д транспортом реализованного товара.

Тарифные ставки для него берутся из паспорта сделки. И вот, внезапно, ставки глобально поменялись. И сей неприятный факт нужно учесть. Старый механизм уже не работает, замену мы ещё не успели перенести - и дело это не быстрое, а отчётность требуется прямо сейчас. Конечно, всегда можно поправить данные в паспорте сделки, но по разным соображениям, это неудобный и непродуктивный вариант.

Среди артефактов в системе был найден доселе неиспользуемый справочник с характерным названием "Ж/д тарифы" - по сути это табличка в базе со станцией отправки, станцией назначения и тарифом на перевозку между ними. На первое время сойдёт, а там уже нормальный блок маршрутов на подходе.
В-общем, я думал, что придётся поломать голову и повыдирать волосьев, но реальность оказалась не такой безрадостной.
Read more... )
seajey: Electronic Knight (Default)
Уважаю людей, знающих, чего им для счастья не хватает.
Тут проснулся один клиент - оказывается, они нам не просто так деньги за поддержку платят, а вполне могут заказать доработки существующего или же совершенно новый отчёт.

Большим плюсом для меня оказалось, что что-то очень похожее я уже делал - есть рабочее и отлаженное решение, осталось только перенести на сервер шаблон и необходимые процедуры/функции, ну и поработать напильником, молотком да стамеской: адаптировать код под MSSQL Server 2000 (кстати, давно пора на свалку, на редкость не удобно после 2005/2008 с ним работать), выкинуть лишнее и добавить недостающее.

На всё про всё ушло два дня. Заказчик доволен, доволен и я (что так легко отделался).

Вот бы со всеми так :(

Коллега уходила в отпуск на три недели, и меня перекинули на её фронт. Так, я только со стороны наблюдал за её мучениями, а теперь и сам вляпался.

Например, неделю уже бьюсь над одним отчётом, сделанным из кусочков других. Не без помощи старших коллег, мой отчёт почти по всем пунктам совпал с проверочным. Считаем затраты на финансирование - не сходится, хоть ты тресни. Разобрали оба отчёта до винтика, обнаружили, что проверочный здесь неправильно считает. Придумали способ как решить проблему, заодно и производительность немного поднять, разработали план, приступили к выполнению - звонок по скайпу: давайте повернём на 90 градусов и всё переиграем :(
seajey: Electronic Knight (Default)
Есть таблица со статьями учёта.
Нужно написать функцию, которая бы для входящей статьи выдавала бы полный список подстатей.
У статьи может быть несколько уровней вложенности, и нужно средствами T-SQL сделать рекурсивный обход.
В итоге всё получилось достаточно просто. Хотя лично я и помучился пару часов.

Читать дальше... )
seajey: Electronic Knight (Default)
В своё время для моего босса (а потом и для меня тоже), который отнюдь не новичок в программировании и работе с базами данных, оказалась, по его словам, приятным открытием следующая штука:

SELECT *
INTO NewTable
FROM OldTable
WHERE <Условие>

Читать дальше... )
seajey: Electronic Knight (Default)
Как-то было мне задание в один наш отчёт добавить два дополнительных столбца.
На первый взгляд ничего сложного, но может так получиться, что все потроха перетрясти придётся - были уже случаи.

Открываю отчёт в редакторе, смотрю откуда он данные получает. Ага, процедура с параметрами. Открываю студию, смотрю процедуру - приткнуться там некуда, нужно лезть на уровень ниже, в функцию.

В функции кода раз в 10 больше - какие-то хитрые вычисления с группировками через временные таблицы.
Но интересно другое: для того, чтобы получить исходные данные, запускается другая процедура, пишущая результаты в отдельную таблицу в БД, уже к которой обращается функция.

В итоге добавил два новых поля в ту таблицу, поправил процедуру, и последовательно протащил все изменения наверх, в отчёт.

Как-то так.
seajey: Electronic Knight (Default)
В офисе - 37,5 градусов. Организм видимо перепутал свою температуру с забортной и решил, что он болеет - в горле першит, сопли, иногда озноб...

В общем, жопа :(
seajey: Electronic Knight (Default)
Вчера в офисе воевали с кондиционером, а то он воздух охлаждать толком не хотел, предпочитая работать тупо вентилятором. По этому поводу даже нашли считавшейся давно потерянной инструкцию от него. Итоговый счёт 2:1 не в нашу пользу :(
seajey: Electronic Knight (Default)
А ещё мы тут устроили маленький внутриофисный переезд.
Ленка придёт, наверняка удивится.
В том числе и новым соседям:)
seajey: Electronic Knight (Default)
И снова меня мучает Visual Basic :(

Есть столбец D, в его ячейках может быть записаны числа 0, 1, 2 или вообще ничего.
Нужно обойти его в цикле, и, если i-тая ячейка содержит цифру 1 - закрасить строку диапазоне Bi:BAi определенным цветом.

Пока из обрывков разных макросов удалось сваять это:

Sub ColorLoneCityRow()
'
 Dim i As Integer
 i = 8

 While Range("D" + CStr(i)).Text <> "***"
	Select Case Range("D" + CStr(i)).Value
		Case 1
		
			Range("B" + CStr(i) + ":BA" + CStr(i)).Select
			With Selection.Interior
				.ColorIndex = 44
				.Pattern = xlSolid
			End With
	End Select
	i = i + 1
 Wend

End Sub


И, о Боже! Оно даже работает!
seajey: Electronic Knight (Default)
Ну если не дня, то утра точно:

"Ты что в школу ходил от дождя прятаться?"
seajey: Electronic Knight (Default)
Тут коллега выдал: мол, вчера не было его на работе, а мог бы и вообще больше никогда не появиться. Включает утром, за завтраком, телевизор, а там играют между собой сборные РФ и США по хоккею. И счёт уже 1:13 (если я правильно запомнил). Ну, он натурально за сердце схватился от таких цыфер. Отлегло только после того, как он разглядел, что играют-то женщины :)
seajey: Electronic Knight (Default)
У нас в компании два основных подразделения: по разработке веб-сайтов, и по созданию корпоративных информационных систем.
И тот и другой департамент работает с базами данных, но немножко по-разному.

Веб-программисты в качестве ключа таблицы любят использовать простой интежеровский счётчик, а мы, соответственно, наоборот  - GUID'ы. И друг на друга смотрим примерно так:
"Нафига заморачиваться с гуидами, когда есть счётчик"
vs
"Зачем с этим счётчиком самому себе проблем подкидывать?"

Вот лично я не очень люблю каунтеры:
1. при неправильных/неверных/ошибочных join'ах таблиц могут вылезти на свет божий трудновыявляемые ошибки из-за неуникальности ключа, по которому соединялись таблички.
Помню на кубикусе был прикол с поменявшимися местами пользователем, создавшим в библиотеке писательскую страничку,  и автором, кому эта страница была посвящена.
Всего-то один неаккуратный UPDATE ...

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

GUID'ы в этом куда отношении проще: если при вставке не указать ключ - он сгенеририруется сам, через функцию newid(), в то же время ключик можно создать предварительно и запомнить в переменной для дальнейшего использования.

Единственно неудобство GUID'а - он длинный как длиннокот, 128 бит как-никак.
seajey: Electronic Knight (Default)
На работе я в основном имею дело с MSSQL Server 2005 Express, отличающейся от старшей версии отсутствием утилит импорта, SQL Agent'а, отвечающего за выполнение заданий по расписанию, ограничением по процессору и по максимальному количеству памяти, доступного  SQL-серверу. Ещё чутка обрезанная студия - например, на предмет поддержки сессии и автокомплита.

На серверах у клиентов стоят более функциональные версии, код, в основном, пишется локально, с последующим переносом на "боевой" сервер.
Перед тем как накатить изменения, очень желательно сделать бекап базы. Чем проще оный сделать - тем выше вероятность того, что бэкап будет действительно произведён, а из интерфейса студии (как в Express-варианте, так и в полной версии) это делать тоскливо (особенно, если резервную копию делаешь не первый десяток раз).
По этому поводу я сделал для себя скрипт и пару табличек - хранить статистику.
Собственно, скрипты.

Read more... )
Спасибо за внимание.
seajey: Electronic Knight (Default)
В холодильнике закончилось молоко, расфасованное в мелкоформатную тару и славное тем, что может стоять открытым неделями.

Пришлось влить в кружку с нескафе натурального - коллега живёт глубоко в области и имеет доступ.

Мало того, что кофе нормально не осветлилсяось, так ещё и осадок выпал :(
seajey: Electronic Knight (Default)
Пишу документацию по проекту и чувствую себя настоящим К.О.:

В форме «Права доступа» можно управлять правами доступа сотрудников к формам.
seajey: Electronic Knight (Default)
Жопа приближается.

Самое плохое, что у неё есть союзники в моём лагере :(

ASP -> PHP

Jun. 2nd, 2009 11:12 pm
seajey: Electronic Knight (Default)
Народ, в той части нашей компании, что занимается разработкой сайтов, начал мигрировать с древнего ASP на PHP.
Впрочем остальной стэк остался прежним: Windows,  MSSQL Server, IIS.

Впрочем, LAMP маленькими шажками, но проникает.

Так вот, портирование начали с админки. В процессе были слышны сетования, что некоторые вещи в ASP'е проще делались, много матов на ; в конце строк и прочее.

Самое сложное AFAIR, с чем пришлось столкнуться, это аналог в MSSQL мускульного limit (x,y). Раньше то он вообще не применялся, но в книжке по PHP идёт через раз.

Помнится, на Кубикусе пришлось повозиться с оптимизацией выдачи результата  подбора по профилю. В итоге сделали кэширование в БД предыдущей выдачи, но вот появился ещё один способ поднять производительность.
 
Погуглив, нашли немало воркэраундов разной степени громоздкости. Встречались и откровенно черезжопные варианты, пока остановились на следующем:

SELECT
rank,
ArticleCode,
ArticleName
FROM  (SELECT
           row_number() OVER (ORDER BY ArticleCode) AS  rank,
           ArticleCode,
           ArticleName
           FROM Articles) AS f
WHERE rank BETWEEN x AND y
ORDER BY
rank

Работает только в MSSQL Server 2005 и выше, впрочем MSSQL 2000 как БД для сайтов у нас больше не встречается.

seajey: Electronic Knight (Default)

Profile

seajey: Electronic Knight (Default)
SeaJey

September 2013

S M T W T F S
123456 7
8 910 11121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 23rd, 2017 10:37 am
Powered by Dreamwidth Studios