Относительно недавно, хотя это начали обсуждать ещё в прошлом году, возникла интересная задачка. В компании реализована интеграция iScala с системой провайдера складских услуг. В частности, как только провайдер склада посылает сообщение о выпуске продукции с таможенного склада (в iScala это перемещение между складами), сообщение обрабатывается механизмом Epicor Service Connect и возникает задача для пользователя по утверждению данной операции. Почему это в своё время потребовалось? В первую очередь для того, чтобы перемещение с таможенного склада на склад продаж было выполнено только тогда, когда начислены все необходимые затраты, как то таможенные пошлины, услуги по сертификации и т.п. Пользователь заходит в монитор задач, выбирает задачу, связанную с определённым заказом на закупку и разрешает перемещение. В iScala происходит перемещение той датой, которая содержалась в XML сообщении, присылаемом складской системой.
С внедрением процедуры отслеживания маркировки товара иногда процесс занимает некоторое время, за которое период успевают закрыть и проводка по перемещению не может быть сделана датой, попадающей в закрытый период. Было решено изменять дату на сегодняшнюю. Но если это делать «вручную» в мониторе задач, то это сумасшедшая работа, ведь проводка по перемещению может содержать десятки, а то и сотни строк. Договорились, что это должно делаться автоматически. Но, интересный вопрос: на какую дату поменять понятно, а какую исходную дату нужно изменить? Иными словами «Как заменить то, не знаю что, на то, что надо?» 🙂
Известно даже, в какой таблице хранится запись, где старую дату нужно изменить на новую. Но как понять, что нужно заменить?
В результате возник вот такой запрос:
update [ScaSystemDB].[dbo].[ScaAssignedTasks] set [MsgIn]=replace(cast([MsgIn] as Nvarchar(max)),'<dta:TransDate>'+substring([MsgIn],15+PATINDEX ( '%<dta:TransDate>%' , [MsgIn] ),10)+'</dta:TransDate>','<dta:TransDate>'+format(getdate(),'yyyy-MM-dd')+'</dta:TransDate>') where MsgIn like '%<msg:MsgType>Stock Transaction</msg:MsgType> <msg:Action>Wait</msg:Action>%'
Самое интересное место здесь вот это:
'<dta:TransDate>'+substring([MsgIn],15+PATINDEX ( '%<dta:TransDate>%' , [MsgIn] ),10)+'</dta:TransDate>'
Это и есть «то, не знаю что». То есть мы ищем содержимое того, что находится между тегами <dta:TransDate> и </dta:TransDate> и меняем его на сегодняшнюю дату. На сервере баз данных создано задание, которое запускается каждый день в 4 часа утра и меняет старую дату на новую, вот и всё 🙂