Вопросы новичка

Вопросы новичка

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

Я создал таблицу контактов. Слева кнопки Edit и Delete. Edit отрабатывает нормально, но Delete удаляет только некоторые записи. На большинство из них выдаёт ошибку типа:

"Delete failed. First exception on row 0 with id 0037F00000MjSZQQA3; first error: DELETE_FAILED, Your attempt to delete Mr. Jack Rogers could not be completed because it is associated with the following cases.: 00001019, 00001020 : []"

Заглянув в список Case я увидел целую череду этих самых Кейсов - все мои попытки удалить что-то.

А некоторые записи удаляются без проблем.

В чем может быть проблема? что это за кейсы такие, которые не позволяют удалить контакт?

Вот код.

<apex:page controller="ContactPageController">

<apex:form id="form" >
<apex:pageBlock title="Contacts">
<apex:pageMessages ></apex:pageMessages>
<apex:pageBlockTable value="{!contacts}" var="row" >
<apex:column >
<apex:outputLink title="" value="/{!row.id}/e?retURL=/apex/{!$CurrentPage.Name}" style="font-weight:bold">Edit</apex:outputLink>&nbsp;|&nbsp;
<a href="javascript:if (window.confirm('Are you sure?')) deleterecord('{!row.Id}');" style="font-weight:bold">Del</a>
</apex:column>
<apex:column value="{!row.Name}"/>
<apex:column value="{!row.Email}"/>
<apex:column value="{!row.AccountId}"/>
<apex:column value="{!row.Level__c}"/>
<apex:column value="{!row.OwnerId}"/>
<apex:column value="{!row.CreatedById}"/>
<apex:column value="{!row.CreatedDate}"/>
</apex:pageBlockTable>
</apex:pageBlock>

<apex:actionFunction action="{!deleterecord}" name="deleterecord" reRender="form" >
<apex:param name="contacts" value="" assignTo="{!SelectedContactId}" />
</apex:actionFunction>
</apex:form>
</apex:page>

public class ContactPageController {

public List<Contact> contacts { get; set; }

//used to get a hold of the account record selected for deletion
public string SelectedContactId { get; set; }

public ContactPageController() {
//load account data into our DataTable
LoadData();
}

private void LoadData() {
contacts = [Select Name, Email, AccountId, Level__c, OwnerId, CreatedById, CreatedDate FROM Contact LIMIT 10000];
}

public void deleterecord()
{
// if for any reason we are missing the reference
if (SelectedContactId == null) {
return;
}

// find the account record within the collection
Contact tobeDeleted = null;
for(Contact a : contacts)
if (a.Id == SelectedContactId) {
tobeDeleted = a;
break;
}
//if account record found delete it
if (tobeDeleted != null) {
delete tobeDeleted;
}

//refresh the data
LoadData();
}

}

Все нормально (правильно) работает. Ты, скорей всего, сделал себе Dev org, в котором есть какой-то набор данных.
Теперь пользователю необходимо объяснить, по какой причине нет возможности удалить Контакт.

Andrii Muzychuk
Все нормально (правильно) работает. Ты, скорей всего, сделал себе Dev org, в котором есть какой-то набор данных.
Теперь пользователю необходимо объяснить, по какой причине нет возможности удалить Контакт.

Так именно я и есть пользователь и разработчик. Это - тестовое задание для вакансии разработчика saleforce, и я просто зарегился на developers.saleforce.com и пытаюсь работать с тем, что есть. Как мне быть? что мне делать, как убрать все эти кейсы? Как избавиться от ошибки? как правильно удалять записи, чтобы они удалялись?

ЗЫ. И да... почему в месте, где передается параметр для удаления, поле value пустое ?

<apex:actionFunction action="{!deleterecord}" name="deleterecord" reRender="form" >

<apex:param name="contacts" value="" assignTo="{!SelectedContactId}" />

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

Jonny-Rico
Как избавиться от ошибки?
Andrii Muzychuk
пользователю необходимо объяснить, по какой причине нет возможности удалить Контакт.

Просто сначала удали кейсы

Gres
Просто сначала удали кейсы

А птм, когда такую работу запулят клиенту, надо будет программера присылать, чтоб он удалял Кейсы? Или клиенту рассказывать через поддержку, что он должен Кейсы поудалять сначала? Ну так же не делается...

Andrii Muzychuk
Gres
Просто сначала удали кейсы

А птм, когда такую работу запулят клиенту, надо будет программера присылать, чтоб он удалял Кейсы? Или клиенту рассказывать через поддержку, что он должен Кейсы поудалять сначала? Ну так же не делается...

Ну дак программно удалить кейсы, не руками жеж. ЛОЛ)

Втихую? Никого не ставя в извесность?

Andrii Muzychuk
Втихую? Никого не ставя в извесность?

Да плевать всем на известность. Это тестовое задание для новичка, пусть даже хоть руками удаляет. Можно подумать что ваше тестовое было выполнено великолепно, что в своем тестовом сами продумывали архитектуру и использовали Custom Label для вывода всех красивых сообщений. Я вас умоляю. Все сначала наговнокодили. А те кто пришел вообще без опыта наговнокодили еще больше.(А некоторые и по сей день любят говнокодить) Вы еще ему скажите: О боги ты пилишь все на старом и никому не нужном visualforce, тебе срочно нужен lightning или любая javascript либа + SLDS + remote actions/remote objects.

А человеку который не может удалить контакт с кейсами, так может его не надо удалять? Стоит об этом подумать. Тем более вам вывели такую замечательную ошибку в которой написано что да как.
Хочешь удалять контакт, создай свой и удаляй. И никаких кейсов, красота:)

Jonny-Rico
<apex:actionFunction action="{!deleterecord}" name="deleterecord" reRender="form" >
<apex:param name="contacts" value="" assignTo="{!SelectedContactId}" />

Потому что ты потом будешь вызывать метод deleterecord(с_вот_этим_параметром_который_и_есть_value)

Maxim Elets
Можно подумать что ваше тестовое было выполнено великолепно
Там, куда я делал тестовое я не проходил :-)
Maxim Elets
на старом и никому не нужном visualforce
Ну, за него по-прежнему платят $40 в час, так что не такой он уж и не нужный ;-)

Смысл моего посыла в том, что хотя бы вывести ошибку https://developer.salesforce.com/page/An_Introduction_to_Exception_Handling#Visualforce

Для тестового задания вполне можно ограничиться тем что просто на дев орге снести все кейсы под чистую и забыть про эту проблему. Обработка таких исключительных ситуаций врядли входит в тестовое задание.
А ошибку автор и так выводит, он же ее нам озвучил. Ну да, она в стандартном и не очень приятном глазу пользователя виде. Но опять же заморачиваться, отлавливать определенные ошибки, переводить их на нормальный английский язык не надо для тестового задания.

Тупо удали кейсы (возможно еще какие-то другие связанные объекты) - я так тоже иногда делаю - чищу новый орг если что-то ипет мозг.

Начинают с малого. И плохо работать тоже с малой работы начинают. Сначала ты в тестовом не отловил ошибку, птм в реальном проекте.
Ошибку надо показать пользователю нормально. Я ж не говорю о том, чтобы написать функционал, где страница объяснит проблему и предложит решить проблему путем удаления Кейсов. Это уже лишнее.
Но элементарное
...
try{
delete tobeDeleted;
} catch (DMLException e){
ApexPages.addMessages(e);
...
должно быть.

Ну так вроде ж это присутствует?

Вот тебе и выдаст (как автор выше написал)
"Delete failed. First exception on row 0 with id 0037F00000MjSZQQA3; first error: DELETE_FAILED, Your attempt to delete Mr. Jack Rogers could not be completed because it is associated with the following cases.: 00001019, 00001020 : []"

Он же спрашивал про причину, а не про то как ошибку вывести :)

А сорян, исходники прошерстил
Нет отлова
Но сути вопроса это не меняет

Дима, как она выводится? ПУСТАЯ БЕЛАЯ СТРАНИЦА с этой ошибкой. Не? Это ж безобразие!

Andrii Muzychuk
Дима, как она выводится? ПУСТАЯ БЕЛАЯ СТРАНИЦА с этой ошибкой. Не? Это ж безобразие!

Вот с этим полностью согласен!!!
Как я отвык от VF

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

Но возник другой вопрос, надеюсь, что поможете.
Курю инфу уже пол дня и не могу понять как сделать в той же моей таблице контактов вывод имени в виде ссылки на просмотр этого контакта?

Погуглив, я сваял следующую строку :

<apex:column>

<apex:outputLink title="" value="/{!row.Name}">{!row.Name}</apex:outputLink>
</apex:column>

Вроде как логично и просто, отображается как ссылка, всё правильно, можно кликнуть на имя контакта, но по клику открывается страница с ошибкой

URL No Longer Exists
You have attempted to reach a URL that no longer exists on salesforce.com.

You may have reached this page after clicking on a direct link into the application. This direct link might be:
• A bookmark to a particular page, such as a report or view
• A link to a particular page in the Custom Links section of your Home Tab, or a Custom Link
• A link to a particular page in your email templates

И вот этого я не могу понять, как так.

Я даже скопировал код, который переводит на страничку редактирования контакта (оно работает без проблем),
убрав в этой конструкции параметр "e" , который судя по мануалам, отвечает именно за то, что открывается именно редактирование. Получилось вот так:

<apex:outputLink title="" value="/{!row.Name}/?retURL=/apex/{!$CurrentPage.Name}" style="font-weight:bold">{!row.id}</apex:outputLink>

И всё равно при клике на имя контакта в таблице - снова та же самая ошибка.

Хелп ми плиз.

<apex:outputLink title="" value="/{!row.Id}">{!row.Name}</apex:outputLink>

ТС, а какой у Вас опыт с СФ?

Dmitry Shnyrev
<apex:outputLink title="" value="/{!row.Id}">{!row.Name}</apex:outputLink>

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

Jonny-Rico
Dmitry Shnyrev
<apex:outputLink title="" value="/{!row.Id}">{!row.Name}</apex:outputLink>

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

а какие айди в сф используются 18 или 15 значные?

Jonny-Rico
что-то я ковырял, и так и не попробовал почему-то сделать именно так.

А чего ковырять
открывается страница нужная, копируется ссылка в текстовый редактор
потом берется ссылка которая не работает, копируется туда же в редактор второй строкой
сравниваем -> находит различия -> профит

vbay
а какие айди в сф используются 18 или 15 значные?

А где смайлик в конце?

vbay
ТС, а какой у Вас опыт с СФ?

Три дня :-)

И обращаясь ко всем остальным: прошу меня извинить за возможно глупые вопросы.
Я "начинающий айтишник" если можно так выразиться. Получаю второе высшее на программиста, изучаю различные языки и технологии. Пытаюсь устроиться Junior-ом куда-нибудь одновременно.
Мне предложили возможность попробоваться на вакансию saleforce разработчика. Ранее я с этим не сталкивался вообще. Есть только базовые знания по SQL и Java.
Я решил попробовать, почему бы и нет, (зарплата выше, чем у меня сейчас вдвое).
Но при этом мне не дали времени изучить Saleforce, а сразу дали тестовое задание и сроку неделю.
Вот я и лезу из кожи вон, одновременно разбираясь как написать код и как оно вообще работает.

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

Dmitry Shnyrev
vbay
а какие айди в сф используются 18 или 15 значные?

А где смайлик в конце? :D

Та какие смайлы :(

Jonny-Rico
vbay
ТС, а какой у Вас опыт с СФ?

Три дня :-)

И обращаясь ко всем остальным: прошу меня извинить за возможно глупые вопросы.
Я "начинающий айтишник" если можно так выразиться. Получаю второе высшее на программиста, изучаю различные языки и технологии. Пытаюсь устроиться Junior-ом куда-нибудь одновременно.
Мне предложили возможность попробоваться на вакансию saleforce разработчика. Ранее я с этим не сталкивался вообще. Есть только базовые знания по SQL и Java.
Я решил попробовать, почему бы и нет, (зарплата выше, чем у меня сейчас вдвое).
Но при этом мне не дали времени изучить Saleforce, а сразу дали тестовое задание и сроку неделю.
Вот я и лезу из кожи вон, одновременно разбираясь как написать код и как оно вообще работает.

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


Дядька, с наскоку сф ты не сделаешь... Сори но тут так не работает. Это вообще свой мир со своими приколами.

Ну че вы так сразу накинулись.
Все когда-то начинали, все через это проходили.
Тут главное сделать ТЗ и попасть в одну фирму.
А там уже на реальных проектах натаскают

vbay
Дядька, с наскоку сф ты не сделаешь... Сори но тут так не работает. Это вообще свой мир со своими приколами.

Ну не могу же я так просто взять и отказаться от шанса устроиться на новую работу? :-)
Нужно попробовать, пытаться. А заранее лапки сложить - это не моё. Ну а то, что это свой мир - это я уже понял буквально сразу :-) Тут своя атмосфера ))

Dmitry Shnyrev
Ну че вы так сразу накинулись.
Все когда-то начинали, все через это проходили.
Тут главное сделать ТЗ и попасть в одну фирму.
А там уже на реальных проектах натаскают :)

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

Да продукт как продукт. Везде свои нюансы.
Я думаю с 1с было бы не легче.

Dmitry Shnyrev
Да продукт как продукт. Везде свои нюансы.
Я думаю с 1с было бы не легче.

Желтая программа это вообще весчь в себе

vbay
мне сразу скзаали, ты будешь учиться и мы ожидаем от тебя за три месяца сертификат дев 1.

Вот кстати вариант.
Если с ТЗ не получится (вдруг не возьмут).
Можно просто не сдаваться и попробовать своими силами сдать на сертификат.
После этого уже я думаю на работу возьмут точно.

vbay
Желтая программа это вообще весчь в себе

По мне лучше эквивалент не придумать (был опыт и с 1с - печальный правда).
Так что когда меня спрашивают чем занимаешься - говорю 1с только для американского рынка. Я никому не вру и вопросов зато мне больше не задают

Dmitry Shnyrev
Так что когда меня спрашивают чем занимаешься - говорю 1с только для американского рынка. Я никому не вру и вопросов зато мне больше не задают

нее, врешь, ты же не в нетсьюте копаешься)

Gres
нее, врешь, ты же не в нетсьюте копаешься)

хорошо. Как тогда вы объясняете простым людям чем занимаетесь?
Можно конечно сказать Java программист. Это будет тоже правильно, но уже немного дальше от правды.

Программист. Делаю Вэб сайты :-)

Andrii Muzychuk
Делаю Вэб сайты :-)

О! Это крайне плохой ответ.
После этого знаешь сколько тупых вопросов начинает сыпаться!!!!

У меня такого нет :-)
Только один раз меня спросили смогу ли я сделать им сайт. На что я ответил:"Нет, очень дорого.". ¯\_(ツ)_/¯

Господа, встречайте ещё один глупый вопрос. :-)

В задании сказано отобразить список контактов в виде таблицы, где каждый столбец соответствует отдельному полю, и приводится список этих полей.: Name (link), Email, Level(picklist), Account(Lookup), Owner(Lookup),Created By(Lookup), Create Date.
В требованиях к наличию эти самых полей указано, что нужно отобразить Name в виде Link - это понятно и логично, при клике на имя открывается описание этого контакта. Но дальше указано Contact level (picklist) - зачем? Отобразить текущий уровень - понятно. Но зачем в таблице контактов отображать этот уровень в виде выпадающего списка? Отобразилась таблица, выбрал я у одного из контактов другой уровень в списке, а дальше что должно происходить? Указаний к наличию кнопки типа "сохранить результаты изменений таблицы" не было. То же самое касается и Account(Lookup), и Owner(Lookup), и Created By(Lookup).

Это вопросы к тому, кто тебе дал это задание ;-)

Andrii Muzychuk
Это вопросы к тому, кто тебе дал это задание ;-)

Я хотел убедиться, что это не я дебил стыдно было бы задавать глупые вопросы работодателю :-)

Я вижу два варианта, для чего попросили сделать выпадающим списком в таблице только для просмотра:
1) Посмотреть, что человек может постороить этот выпадающий список
2) Посмотреть, что человек может задать вопрос про ЦЕЛЕСООБРАЗНОСТЬ такого решения

Interesting information? Help us, post link to social media..