Просмотр полной версии : Свзяка ПДС + РК7 +РК 6 + fixlen
Добрый день. имеется небольшая сеть ресторанов. во всех кроме одного стоит РК6 в последнем РК7 есть ПДС. На РК6 есть fixlen, так как нумерация карт пересекается. Как в РК7 организовать работу ранее выданых карт. Точнее даже так в каком скрипте и что поправить что бы карты работали? До дилера не достучаться и он особо не торопиться шевелиться, а руководство требуют все организовать очень быстро. Заранее благодарю.
P. S. по поиску ничего подобного не нашел, мануалы от UCS конечно же недоступны.
Примеры карт приведите.
Что есть на карте -> какой номер нужно получить в 7ке
Делается все через MCR алгоритмы.
А там может быть маской дело ограничится, а может быть скрипт потребуется.
Примеры карт приведите.
Что есть на карте -> какой номер нужно получить в 7ке
Делается все через MCR алгоритмы.
А там может быть маской дело ограничится, а может быть скрипт потребуется.
На карте закодировано 778=216580001=NNNNN , это реальный номер первого ресторана, у второго ресторана код другой, через фикслен к номеру карты добавляется еще цифра 30, ну и собственно надо что бы новый ресторан на РК7 смог принимать карты с подобной кодировкой.
Скрипт надо писать. Маской тут не обойтись будет.
Будет время - напишу скрипт.
Возможно кто то раньше успеет...
Скрипт надо писать. Маской тут не обойтись будет.
Будет время - напишу скрипт.
Возможно кто то раньше успеет...
Буду очень благодарен
Что значит добавляется? Карта 7777 в первом ресторане, во втором? 7807 или 777730?
Если и не готовое решение, то направление, куда думать.
Сервис - Обработка сигналов устройств - MCR-алгоритмы
Персональные дебетовые (ПДС), делаем копию.
В свойствах внизу - Скрипт, открываем.
Скрипт принимает на вход строку Parameter, пытается ее преобразовать и возвращает ответ, соответствует ли код в строке коду ресторана.
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin - здесь скрипт определяет, что строка начинается с 778. При неверной кодировке можно задать свое начало строки.
delete(Parameter, 1, 4); - здесь удаляется все начало, остается только "КодРесторана=КодКарты"
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1); - в RestCode копируется код ресторана
delete(Parameter, 1, pos('=', Parameter)); - удаляется код ресторана, остается только код карты. Важно, чтобы алгоритм дошел до этого пункта.
if RestCode mod 10000 = 0 then - если код, в конце без кода ресторана (делится на 1000 без остатка), то...
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode') - ... проверяем на соответствие коду предприятия,
else
Result := RestCode = IntParam('RestaurantCode'); - а иначе проверяем на соответствие полному коду.
end;
end;
end;
Если у нас закодированный код не совпадает, то нам надо добавить условия, по которым будет срабатывание.
Есть две задачи:
1. принимать чужой код ресторана
2. у карт с чужим номером отбрасывать "30" в начале.
Если просто не совпадает код ресторана, то алгоритм нормально пройдет разбор номера и в Parameter будет номер карты, но споткнется при сравнении с кодом ресторана.
Поэтому, для первой задачи можно просто добавить условие в строку последней проверки:
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001); - начальное условие оставил и взял в скобки для удобства, далее добавлено ИЛИ и прямое сравнение с кодом, закодированным на карте. 123450001 - код чужого ресторана.
Далее, в Parameter у нас остается код карты, но он с лидирующими 30, т.е. формата 301234
Можно, например, так
После
delete(Parameter, 1, pos('=', Parameter));
Добавить строку
if RestCode = 123450001 then delete(Parameter, 1, 2);
- эта операция должна удалить первые два символа.
Если я нигде не ошибся, то итог будет такой:
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin
delete(Parameter, 1, 4);
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1);
delete(Parameter, 1, pos('=', Parameter));
if RestCode = 123450001 then delete(Parameter, 1, 2);
if RestCode mod 10000 = 0 then
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode')
else
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001);
end;
end;
end;
я думаю 307777
Да именно так фикслен в начале номера карты добавляет 30 и получается номер карты типа 30NNNNN
- - - Добавлено - - -
Если и не готовое решение, то направление, куда думать.
Сервис - Обработка сигналов устройств - MCR-алгоритмы
Персональные дебетовые (ПДС), делаем копию.
В свойствах внизу - Скрипт, открываем.
Скрипт принимает на вход строку Parameter, пытается ее преобразовать и возвращает ответ, соответствует ли код в строке коду ресторана.
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin - здесь скрипт определяет, что строка начинается с 778. При неверной кодировке можно задать свое начало строки.
delete(Parameter, 1, 4); - здесь удаляется все начало, остается только "КодРесторана=КодКарты"
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1); - в RestCode копируется код ресторана
delete(Parameter, 1, pos('=', Parameter)); - удаляется код ресторана, остается только код карты. Важно, чтобы алгоритм дошел до этого пункта.
if RestCode mod 10000 = 0 then - если код, в конце без кода ресторана (делится на 1000 без остатка), то...
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode') - ... проверяем на соответствие коду предприятия,
else
Result := RestCode = IntParam('RestaurantCode'); - а иначе проверяем на соответствие полному коду.
end;
end;
end;
Если у нас закодированный код не совпадает, то нам надо добавить условия, по которым будет срабатывание.
Есть две задачи:
1. принимать чужой код ресторана
2. у карт с чужим номером отбрасывать "30" в начале.
Если просто не совпадает код ресторана, то алгоритм нормально пройдет разбор номера и в Parameter будет номер карты, но споткнется при сравнении с кодом ресторана.
Поэтому, для первой задачи можно просто добавить условие в строку последней проверки:
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001); - начальное условие оставил и взял в скобки для удобства, далее добавлено ИЛИ и прямое сравнение с кодом, закодированным на карте. 123450001 - код чужого ресторана.
Далее, в Parameter у нас остается код карты, но он с лидирующими 30, т.е. формата 301234
Можно, например, так
После
delete(Parameter, 1, pos('=', Parameter));
Добавить строку
if RestCode = 123450001 then delete(Parameter, 1, 2);
- эта операция должна удалить первые два символа.
Если я нигде не ошибся, то итог будет такой:
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin
delete(Parameter, 1, 4);
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1);
delete(Parameter, 1, pos('=', Parameter));
if RestCode = 123450001 then delete(Parameter, 1, 2);
if RestCode mod 10000 = 0 then
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode')
else
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001);
end;
end;
end;
Спасибо большое, сегодня попробую, ход мысли скрипта более менее понятен, есть хотя бы от чего оттолкнуться.
- - - Добавлено - - -
А еще такой вопрос, есть подозрение что фикслен не очень нужен. если его отключить в первом ресторане, то можно обойтись без скрипта? А например маска или просто префикс?
А еще такой вопрос, есть подозрение что фикслен не очень нужен. если его отключить в первом ресторане, то можно обойтись без скрипта? А например маска или просто префикс?
Вот вообще вопроса не понял.
Вот вообще вопроса не понял.
Попробую прояснить как смогу. Фикслен используется потому что в базе несколько фудкортов с разными кодами ресторана и были выпущены карты с одинаковыми номерами, но с разными кодами ресторана, дилер настроил ПДС так что бы номера карт не пересекались, и в той же базе первый ресторан на РК 6 с кодом ресторана который я писал выше, на него выпущено порядка 3000 карт с номерами 00001 и далее до 30000, если в первом ресторане убрать фикслен что бы он не подставлял в начале номера карты цифру 30 и в базе ПДС изменить все эти карты на нормальные номера, то можно обойтись без скрипта и вообще будет ли работать эта система.
P. S. я сам к дилерству не имею отношение и немного далек от системы r keeper, я в этой конторе просто слежу за нормально работой сети и техники. но имею админские права в РК7
Не, без скрипта не обойтись. И скрипт я не правильно написал. 30 не на карте, а в системе. Надо не убирать 30, а добавлять.
if RestCode = 123450001 then delete(Parameter, 1, 2);
- эта операция должна удалить первые два символа.
тогда получается надо изменить эту строку, и вписать по другому? не подскажете что написать? =)
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
result := false;
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then
begin
delete(Parameter, 1, 4);
if pos('=', Parameter) > 1 then
begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1);
delete(Parameter, 1, pos('=', Parameter));
if RestCode = 123450002 then
Parameter := '30'+Parameter;
Result := RestCode div 10000 = IntParam('EnterpriseCode')
end;
end;
end;
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;var RestCode: integer;begin result := false; { 778=КодРесторана=КодКарты } if pos('778=', Parameter) = 1 then begin delete(Parameter, 1, 4); if pos('=', Parameter) > 1 then begin RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1); delete(Parameter, 1, pos('=', Parameter)); if RestCode = 123450002 then Parameter := '30'+Parameter; Result := RestCode div 10000 = IntParam('EnterpriseCode') end; end;end;спасибо, сегодня попробую
Powered by vBulletin® Version 4.2.6 LTS Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot