Регистрация  |  Вход

A что конструкции Switch-case нет в Апексе?

A что конструкции Switch-case нет в Апексе?

A что конструкции Switch-case нет в Апексе?

Den Brown
A что конструкции Switch-case нет в Апексе?

к сожалению нет :(

[quote="Den Brown"]A что конструкции Switch-case нет в Апексе?[/quote]

к сожалению нет :(

Чем не угодил старый добрый if?

if (condition) {
} else if (condition){
} else if (condition){
} else{
}

Чем не угодил старый добрый if?
[code]
if (condition) {
} else if (condition){
} else if (condition){
} else{
}
[/code]

Я удивляюсь, что узнал об этом только сейчас! :D

Я удивляюсь, что узнал об этом только сейчас!  :D

Тут ничего удивительного.

В самой Java полнофункциональный switch - case (который понимает строковые параметры) появился совсем недавно (в Java 7).

Тут ничего удивительного.

В самой Java полнофункциональный switch - case (который понимает строковые параметры) появился совсем недавно (в Java 7).

Странно почему вы вопрос про Generic не задали

...а появились в Java они давно

Странно почему вы вопрос про Generic не задали

...а появились в Java они давно

Вот даже не знал что это такое и полез в google
А это оказывается такая повседневная штука в SF List<String> которая используется на уровне подсознания, потому что в SF она обязательна.

Век живи век учись.

Спасибо за наводку.

Вот даже не знал что это такое и полез в google :)

А это оказывается такая повседневная штука в SF List[b]<String>[/b] которая используется на уровне подсознания, потому что в SF она обязательна.

Век живи век учись.

Спасибо за наводку.

Вижу тема перешла к другому, но тоже очень интересному вопросу.

Как я слышал, APEX - это JAVA-подобный язык, а может быть и вовсе "урезанная" версия JAVA.

Но в чем отличия (синтаксические отличия) между APEX и JAVA?

Наверное проще сказать, чего еще нет в APEX, что есть в JAVA (и при этом повседневно используется в JAVA, как например SWITCH)?

Вижу тема перешла к другому, но тоже очень интересному вопросу.

Как я слышал, APEX - это JAVA-подобный язык, а может быть и вовсе "урезанная" версия JAVA.

Но в чем отличия (синтаксические отличия) между APEX и JAVA? 

Наверное проще сказать, чего еще нет в APEX, что есть в JAVA (и при этом повседневно используется в JAVA, как например SWITCH)?

Dmitry Shnyrev
Вот даже не знал что это такое и полез в google
А это оказывается такая повседневная штука в SF List<String> которая используется на уровне подсознания, потому что в SF она обязательна.

Век живи век учись.

Спасибо за наводку.

На самом деле в Apex мелкое подобие generic типов, вся их мощь заключается в том, что однажды написав generic класс или метод, можно потом использовать его с "различными типами". Современные ооп языки (java, c#) позволяю ещё разграничивать generic параметр, на принадлежность его к какому либо классу или интерфейсу, тем самым требуя от программиста вставки нужного типа, а в теле generic класса/метода можно использовать интерфейс ограничения. В общем в умелых руках - это манна небесная) Уж очень не хватает этого в Apex(

[quote="Dmitry Shnyrev"]Вот даже не знал что это такое и полез в google :)

А это оказывается такая повседневная штука в SF List[b]<String>[/b] которая используется на уровне подсознания, потому что в SF она обязательна.

Век живи век учись.

Спасибо за наводку.[/quote]

На самом деле в Apex мелкое подобие generic типов, вся их мощь заключается в том, что однажды написав generic класс или метод, можно потом использовать его с "различными типами". Современные ооп языки (java, c#) позволяю ещё разграничивать generic параметр, на принадлежность его к какому либо классу или интерфейсу, тем самым требуя от программиста вставки нужного типа, а в теле generic класса/метода можно использовать интерфейс ограничения. В общем в умелых руках - это манна небесная) Уж очень не хватает этого в Apex(

dlisovsky
Уж очень не хватает этого в Apex(

Я про тоже...

[quote="dlisovsky"]

 Уж очень не хватает этого в Apex([/quote]

Я про тоже...

Den Brown
Вижу тема перешла к другому, но тоже очень интересному вопросу.

Как я слышал, APEX - это JAVA-подобный язык, а может быть и вовсе "урезанная" версия JAVA.

Но в чем отличия (синтаксические отличия) между APEX и JAVA?

Наверное проще сказать, чего еще нет в APEX, что есть в JAVA (и при этом повседневно используется в JAVA, как например SWITCH)?

Нет sleep. Не то что бы смертельно, но напрягает.

[quote="Den Brown"]Вижу тема перешла к другому, но тоже очень интересному вопросу.

Как я слышал, APEX - это JAVA-подобный язык, а может быть и вовсе "урезанная" версия JAVA.

Но в чем отличия (синтаксические отличия) между APEX и JAVA? 

Наверное проще сказать, чего еще нет в APEX, что есть в JAVA (и при этом повседневно используется в JAVA, как например SWITCH)?[/quote]

Нет sleep. Не то что бы смертельно, но напрягает.

Интересно слышать про sleep.

Как-то на salesforce не приходилось задумываться об использовании этой команды Обычно вся логика крутится вокруг получить данные, обработать и сохранить в базу.

Можно какой-нибудь пример из жизни?

Интересно слышать про sleep.

Как-то на salesforce не приходилось задумываться об использовании этой команды :)
Обычно вся логика крутится вокруг получить данные, обработать и сохранить в базу. 

Можно какой-нибудь пример из жизни?

Dmitry Shnyrev
Интересно слышать про sleep.

Как-то на salesforce не приходилось задумываться об использовании этой команды Обычно вся логика крутится вокруг получить данные, обработать и сохранить в базу.

Можно какой-нибудь пример из жизни?

Получение данных от стороннего сервиса в асинхронном режиме с автоматической проверкой через 1-2-3-....n секунд

[quote="Dmitry Shnyrev"]Интересно слышать про sleep.

Как-то на salesforce не приходилось задумываться об использовании этой команды :)
Обычно вся логика крутится вокруг получить данные, обработать и сохранить в базу. 

Можно какой-нибудь пример из жизни?[/quote]

Получение данных от стороннего сервиса в асинхронном режиме с автоматической проверкой через 1-2-3-....n секунд

Вот еще отличие:

в JAVA вижу 'array.length'

а в АРЕХ - 'array.size()'

Вот еще отличие:

в JAVA вижу 'array.length'

а в АРЕХ - 'array.size()'

Столкнулся с необходимостью sleep!!!

контроллер вствляет пачку записей в каждой из которых редактировалось одно поле.

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

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

И нашел вариант:

Integer start = System.Now().millisecond();
while(System.Now().millisecond()< start+10){
}

но не помогает. все равно ПДФ страница выкверивает из записей предыдущие сохраненные значения, но не только что сохраненное...

Столкнулся с необходимостью sleep!!!

контроллер вствляет пачку записей в каждой из которых редактировалось одно поле.

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

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

И нашел вариант:

[code] Integer start = System.Now().millisecond();
        while(System.Now().millisecond()< start+10){ 
        }[/code]

но не помогает. все равно  ПДФ страница выкверивает из записей предыдущие сохраненные значения, но не только что сохраненное...

Den Brown
Столкнулся с необходимостью sleep!!!

контроллер вствляет пачку записей в каждой из которых редактировалось одно поле.

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

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

И нашел вариант:

Integer start = System.Now().millisecond();
while(System.Now().millisecond()< start+10){
}

но не помогает. все равно ПДФ страница выкверивает из записей предыдущие сохраненные значения, но не только что сохраненное...

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_order_of_execution.htm

[quote="Den Brown"]Столкнулся с необходимостью sleep!!!

контроллер вствляет пачку записей в каждой из которых редактировалось одно поле.

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

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

И нашел вариант:

[code] Integer start = System.Now().millisecond();
        while(System.Now().millisecond()< start+10){ 
        }[/code]

но не помогает. все равно  ПДФ страница выкверивает из записей предыдущие сохраненные значения, но не только что сохраненное...[/quote]

[url]http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_order_of_execution.htm[/url]

вы предлагаете перенести создание ПДФ в тригер, который точно сработает после апдатирования всей пачки записей?

это идея, надо попробовать...

вы предлагаете перенести создание ПДФ в тригер, который точно сработает [b]после апдатирования всей пачки[/b]  записей?

это идея,  надо попробовать...

Den Brown
вы предлагаете перенести создание ПДФ в тригер, который точно сработает после апдатирования всей пачки записей?

это идея, надо попробовать...


Если чесно не очень хорошо понял задание,но не в этом дело я думаю что в salesforce работает с событийное моделью а не с временной.
То есть пока не сделался последний инсерт триггера before и только после этого начнется выполнятся триггера с аfter insert т.д.Насколько я понимаю тime break выполняются исключительно в контектсте одного события не более.

[quote="Den Brown"]вы предлагаете перенести создание ПДФ в тригер, который точно сработает [b]после апдатирования всей пачки[/b]  записей?

это идея,  надо попробовать...[/quote]
Если чесно не очень хорошо понял задание,но не в этом дело я думаю что в salesforce работает с событийное моделью а не с временной.
То есть пока не сделался последний инсерт триггера before и только после этого начнется выполнятся триггера с аfter insert т.д.Насколько я понимаю тime break выполняются исключительно в контектсте одного события не более.

если вы конечно не выполняете это @future или batch method,Тогда там работает много поточность.

если вы конечно не выполняете это @future или batch method,Тогда там работает много поточность.

Вот ситуация: на кастомной ВФ выведен лист в 250 записей у каждой из который есть поле, открытое на редактирование, где кастомер выбирает: плохо или хорошо. В завершении кастомер нажимает кнопку "Сохранить изменения и создать ПДФ отчет".

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

Так вот эта спец страница получает из записей предыдущее значение.

Хочу попробовать вынести этот блок - создание ПДФ - в триггер афтер апдейт.

Програмно передать все занчение в спец страницу в виде гет параметров - можно, но список диначески создаваемый, по моему это не верный ход.

Еще как вариант - создавать ПДФ не из страницы, а из е-майл шаблонов, которые рендерятся как ПДФ - тогда я не завишу от того как и когда сохранились записи, но эту методику я еще не использовал.

Вот ситуация: на кастомной ВФ выведен лист в 250 записей у каждой из который есть поле, открытое на редактирование, где кастомер выбирает: плохо или хорошо. В завершении кастомер нажимает кнопку "Сохранить изменения и создать ПДФ отчет".

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

Так вот эта спец страница получает из записей предыдущее значение.

Хочу попробовать вынести этот блок - создание ПДФ - в триггер афтер апдейт.

Програмно передать все занчение в спец страницу в виде гет параметров  - можно, но список диначески создаваемый, по моему это не верный ход.

Еще как вариант - создавать ПДФ не из страницы, а из е-майл шаблонов, которые рендерятся как ПДФ - тогда я не завишу от того как и когда сохранились записи, но эту методику я еще не использовал.

перенес создание ПДФ в тригер.
все работает.
почти все: в тригере невозможно получить ПДФ боди из ПДФ страницы. <!-- s:cry: --><img src="{SMILIES_PATH}/icon_cry.gif" alt=":cry:" title="Плачет или сильно расстроен" /><!-- s:cry: -->
придется идти по пути использованя ПДФ шаблона...

перенес создание ПДФ в тригер. 
все работает. 
почти все: в тригере невозможно получить ПДФ боди из ПДФ страницы.  <!-- s:cry: --><img src="{SMILIES_PATH}/icon_cry.gif" alt=":cry:" title="Плачет или сильно расстроен" /><!-- s:cry: --> 
придется идти по пути использованя ПДФ шаблона...

Den Brown
Вот ситуация: на кастомной ВФ выведен лист в 250 записей у каждой из который есть поле, открытое на редактирование, где кастомер выбирает: плохо или хорошо. В завершении кастомер нажимает кнопку "Сохранить изменения и создать ПДФ отчет".

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

Так вот эта спец страница получает из записей предыдущее значение.

Хочу попробовать вынести этот блок - создание ПДФ - в триггер афтер апдейт.

Програмно передать все занчение в спец страницу в виде гет параметров - можно, но список диначески создаваемый, по моему это не верный ход.

Еще как вариант - создавать ПДФ не из страницы, а из е-майл шаблонов, которые рендерятся как ПДФ - тогда я не завишу от того как и когда сохранились записи, но эту методику я еще не использовал.


Боюсь что с триггером не получится
5.Saves the record to the database, but doesn't commit yet.
6.Executes all after triggers.
17.Commits all DML operations to the database

Но в любом случае попробуй.

если не получится попробуй отправить самому себе е-mail service
18.Executes post-commit logic, such as sending email

[quote="Den Brown"]Вот ситуация: на кастомной ВФ выведен лист в 250 записей у каждой из который есть поле, открытое на редактирование, где кастомер выбирает: плохо или хорошо. В завершении кастомер нажимает кнопку "Сохранить изменения и создать ПДФ отчет".

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

Так вот эта спец страница получает из записей предыдущее значение.

Хочу попробовать вынести этот блок - создание ПДФ - в триггер афтер апдейт.

Програмно передать все занчение в спец страницу в виде гет параметров  - можно, но список диначески создаваемый, по моему это не верный ход.

Еще как вариант - создавать ПДФ не из страницы, а из е-майл шаблонов, которые рендерятся как ПДФ - тогда я не завишу от того как и когда сохранились записи, но эту методику я еще не использовал.[/quote]
Боюсь что с триггером не получится 
5.Saves the record to the database, but doesn't commit yet.
6.Executes all after triggers.
17.Commits all DML operations to the database

Но в любом случае попробуй.

если не получится попробуй отправить самому себе е-mail service
18.Executes post-commit logic, such as sending email

Den Brown
перенес создание ПДФ в тригер.
все работает.
почти все: в тригере невозможно получить ПДФ боди из ПДФ страницы. <!-- s:cry: --><img src="{SMILIES_PATH}/icon_cry.gif" alt=":cry:" title="Плачет или сильно расстроен" /><!-- s:cry: -->
придется идти по пути использованя ПДФ шаблона...

Вот и здорово.

[quote="Den Brown"]перенес создание ПДФ в тригер. 
все работает. 
почти все: в тригере невозможно получить ПДФ боди из ПДФ страницы.  <!-- s:cry: --><img src="{SMILIES_PATH}/icon_cry.gif" alt=":cry:" title="Плачет или сильно расстроен" /><!-- s:cry: --> 
придется идти по пути использованя ПДФ шаблона...[/quote]
Вот и здорово.

Использовал путь описанный здесь:
http://corycowgill.blogspot.ch/2012/02/generating-pdf-in-apex-trigger.html

он заключается в том что есть метод создания ПДФ боди

attachmentPDF.body = Blob.toPDF(pdfContent);
который в отличие от использования с этой целю ПДФ рендеринг страницы не зависит от наличия SessionID, и поэтому работает везде.

А если я имею этот альтернативный метод, то мне и смысла нет использовать тригер - я поместил его в Контроллер, где я имею всю нужную инфу для создания ПДФ таким методом, и я уже соверешенно независим от того, успел ли апдатироваться мой список или нет, т.к. не использую для создания ПДФ какую сторонную ВФ страницу.

Осталось только добавить, что ПДФ рендеринг страницы не любят стили, а метод Blob.toPDF(pdfContent) не любит их даже еще сильнее.

И еще: когда я дебагил тригер (от которого впоследствии отказался), мне показалось, что если апдатируешь запись обычным путем (со стандарстной детэйл страницы), то тригер- работает и лог-запись приходит в Developer Console (все как обычно). А вот когда я апдаптировал пачку записей в контроллере, то тригер срабатывал - а вот отдельной лог записи о его работе в Developer Console я не получал...

Использовал путь описанный здесь:
[url]http://corycowgill.blogspot.ch/2012/02/generating-pdf-in-apex-trigger.html[/url]

он заключается в том что есть метод создания ПДФ боди  [code] attachmentPDF.body = Blob.toPDF(pdfContent);[/code] который в отличие от использования с этой целю ПДФ рендеринг страницы не зависит от наличия SessionID, и поэтому работает везде.

А если я имею этот альтернативный метод, то мне и смысла нет использовать тригер - я поместил его в Контроллер, где я имею всю нужную инфу для создания ПДФ таким методом, и я уже соверешенно независим от того, успел ли апдатироваться мой список или нет, т.к. не использую для создания ПДФ какую сторонную ВФ страницу.

Осталось только добавить, что ПДФ рендеринг страницы не любят стили, а метод Blob.toPDF(pdfContent) не любит их даже еще сильнее.

И еще: когда я дебагил тригер (от которого впоследствии отказался), мне показалось, что если  апдатируешь запись обычным путем (со стандарстной детэйл страницы), то тригер- работает и лог-запись приходит в Developer Console (все как обычно). А вот когда я апдаптировал пачку записей в контроллере, то тригер срабатывал - а вот отдельной лог записи о его работе в Developer Console я не получал...

Вот еще ситуация общего характера о JAVA:

код взят из Андройд СДК:

String[] position = { "Программер", "Бухгалтер", "Программер",
"Программер", "Бухгалтер", "Директор", "Программер", "Охранник" };

int salary[] = { 13000, 10000, 13000, 13000, 10000, 15000, 13000, 8000 };

создаются массивы. В первой случае квадратные скобки стоят у объявленного типа (String[]), во втором случай - у имени переменной(salary[]).

какя понял - никакой разницы. Надо попробовать - это работает также в Апексе или нет.

Вот такие маленькие нюансы иногда сбивают с толку, и создают ощущение, что ты учил-учил, и все равно не доучил....

Вот еще ситуация общего характера о JAVA:

код взят из Андройд СДК:

[code]  String[] position = { "Программер", "Бухгалтер", "Программер",
      "Программер", "Бухгалтер", "Директор", "Программер", "Охранник" };

  int salary[] = { 13000, 10000, 13000, 13000, 10000, 15000, 13000, 8000 };[/code]

создаются массивы. В первой случае квадратные скобки стоят у объявленного типа (String[]), во втором случай - у имени переменной(salary[]).

какя понял - никакой разницы. Надо попробовать - это работает также в Апексе или нет. 

Вот такие маленькие нюансы иногда сбивают с толку, и создают ощущение, что ты учил-учил, и все равно не доучил....