сумма прописью с выделением ндс

Автор Pet900, 10 октября 2012, 00:09

0 Пользователи и 1 гость просматривают эту тему.

Pet900

Всех приветствую!
Существует потребность дублировать числовое значение прописью, причем автоматически необходимо выделять НДС (18%) и его также записывать цифрой и дублировать текстом.
т.е. что-то типа: 1256,45 (Одна тысяча двести пятьдесят шесть) рублей 45 копеек, в том числе НДС 18% 191,66 (Сто девяносто один) рубль 66 копеек.
Важно, чтобы при сохранении в форматы MS Office эти данные не слетали (т.е. нужна независимость от ПО стороннего компа)
В MS Word для этого существует плагин untaco-nds (http://orlovs.pp.ru/soft.php#sftund) и нек-рые подобные...
В ООО я новичек, и ничего подобного найти не смог(
Буду признателен, если подскажете решения)


JohnSUN

Боюсь, Pet900, что в такой постановке задача решения не имеет.
Для книг Calc еще можно было бы попытаться обойтись одними формулами на скрытом листе и это сработало бы при переходе к майкрософтовским форматам хранения. А для Writer/Word прямого решения просто нет. Преобразование в сумму прописью еще можно сделать средствами, скажем, cyrtools1.3, но дополнительный функционал, который мои однофамильцы вставили в Untaco-NDS (обновление текстовок при изменении сумм) реализовать крайне сложно. Можно, но сложно. И даже то, что "код программы открыт для изучения", мало поможет в адаптации кода к ООо-LiO - слишком разные бэйсики используются в этих офисах.
То есть, или снимай ограничение "чтобы при сохранении в форматы MS Office эти данные не слетали", или продолжай пользоваться одним только Word'ом с Untaco-NDS
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

Обновление при изменении не нужно)
Достаточно, чтобы просто сохранялись буквенно-цифровые данные, полученные в ООО

JohnSUN

А, тогда, действительно, одного cyrtools1.3 будет достаточно
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

Так ведь он не выделяет ндс, да к тому же, нужно число дублировать, чтобы он мог заменить второе на текст. Или я чего-то недопонимаю?)
Спсб

JohnSUN

 ;D
Не "недопонимаешь", а "не дописываешь"... Я когда рекомендовал cyrtools, имел в виду, что макросы из SumLiterally могут стать основой для маленького дополнительного макроса, который сам будет копировать из текста документа текущее число, вычислять НДС, формировать с помощью, скажем,  n2s_ru_RUR нужную строку и вставлять ее обратно в текст.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

Я в макросах не силен (честно - только слышал о них)). Буду признателен за ссылки - где почитать о конкретных вещах)
Спсб

JohnSUN

Уверяю тебя, для этой задачи особых знаний не потребуется.
Просто открой в редакторе макросов (Alt+F11) библиотеку CyrillicTools, модуль SumLitManage. Найди процедуру insertSumWriter.
Видишь? Это всего-то 20 строк кода. Что они делают? Из текущего документа берутся все выделенные фрагменты (их же может быть больше одного, если с зажатым Ctrl выделять), в цикле перебираются. Из каждого выделения выдергивается строка текста, запятая заменяется на точку (чтобы не сбивать с толку функцию Val(), она с точкой работает), пытается получить число из этой строки и затолкать его в переменную dInValue. Вот в этом месте тебе нужно будет дописать вычисление НДС.
Дальше в переменную sOutText запихивается результат функции getSumLiterally от значения dInValue. А тебе нужно будет сцепить результат двух таких функций - одной точно такой же как и была, а второй - от вычисленного НДС. Ну, еще и дописать первоначальный числовой вариант суммы (она в LTrim (oSelections (i).getString())) и числовой вариант НДС (его получишь функцией FORMAT - в Справке подробно расписана)

А последний оператор заменяет текст выделения на получившуюся строку.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

Спсб за подробные инструкции - ушел осваивать)

Pet900

И снова здравствуйте!)
без малого пол-года не принесли желаемого рез-та(( Я так и не разобрался в вопросе - мои знания в этой области даже не позволяют понять, с какой стороны зайти))
В итоге вынужден просить уважаемое сообщество написать/адаптировать макрос из cyr tools, к-рый бы решал выше описанные задачи. По воз-ти, он должен не заменять имеющийся в cyr tools макрос, а быть доп. командой в меню или кнопкой на панели.
Заранее спсб

JohnSUN

#10
Да нздорв!
Напомни, плиз, как ты формулируешь окончательную задачу? А то ведь за полгода и новое видение проблемы могло появиться...
Речь идет только о текстовых документах? Сумму, которую нужно расписать будешь выделять перед запуском макроса? В каком формате расписывать и какую ставку налога использовать?

Sub insertSumNDSWriter (Optional oDocument As Object)
Const NDS = 0.18
Dim dInValue As Double
Dim dInNDSValue As Double
Dim sOutText As String
Dim oSelections As Object
Dim i As Integer
Dim sTestString As String
If IsMissing(oDocument) Then oDocument = ThisComponent
GlobalScope.BasicLibraries.LoadLibrary("CyrillicTools")
oSelections = oDocument.getCurrentSelection()
For i = 0 To oSelections.getCount() - 1
sTestString = LTrim (oSelections (i).getString())
If sTestString <> "" Then sTestString = join (split (sTestString, ","), ".")
dInValue = Val (sTestString)
If dInValue <> 0 Then
dInNDSValue = dInValue - dInValue/(1+NDS)
sOutText = Trim (oSelections (i).getString()) + " (" _
+ getSumLiterally (dInValue,"ru", "рубль", 2, _
"Masculine", "рубля", "рублей", "коп.", True) _
+ "), в том числе НДС " + Format(NDS,"%") + " " + Format(dInNDSValue,"Fixed") _
+ " (" + getSumLiterally (dInNDSValue,"ru", "рубль", 2, _
"Masculine", "рубля", "рублей", "коп.", True) _
+ ")"
oSelections (i).SetString (sOutText)
End If
Next i
End Sub
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

#11
О, гран мерси!)
Отлично работает - прям как и задумывалось!)
Пока столкнулся только с одной проблемой - никак не могу понять, как вытащить кнопку в панель, к-рая бы вызывала данный макрос.
Я пока скопировал код в Мои макросы/Standart/Module1 и сохранил, потом нажимаю "назначить", создаю новое меню, добавляю кнопку, но когда нажимаю на нее, получаю вот такое окно
Че я не так делаю?)

JohnSUN

А, ты в этом смысле... Дело в том, что при вызове макроса из пункта меню или с панели инструментов нельзя передавать параметры. А вот если макрос вешаешь на кнопку формы, то имеешь право указать параметр oEvent, который расскажет макросу кто его вызвал...
Поэтому просто допиши туда же, в Мои макросы/Standart/Module1 такую процедуру:
Sub getNDS()
  insertSumNDSWriter(ThisComponent)
End Sub

и назначай на пункт меню уже её вызов...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pet900

Цитата: JohnSUN от 28 февраля 2013, 10:40и назначай на пункт меню уже её вызов...
Как часы!))
Спсб!